什么是aapt?
执行命令: C:\Users\Xiaopeng>aapt
Android Asset Packaging Tool
1、列出apk包的内容
aapt l[ist] [-v] [-a] file.{zip,jar,apk}
注:filepath是apk存放的路径
aapt l -v filepath/..apk:以table的形式列出来(不过我用起来老是出,win7和xp都一样,大家可以试一下)
aapt l -a filepath/..apk:详细的列出apk的内容
由于内容太多,我们把内容都存放到txt文件里,打开查看
aapt l filepath/..apk:查看apk内容
由于内容太多,我们把内容都存放到txt文件里,打开查看
对比一下可以看出,aapt l -a filepath/..apk 显示的apk内容更详细。
2、查看apk的一些信息
aapt d[ump] [--values] WHAT file.{apk} [asset [asset ...]]
badging Print the label and icon for the app declared in APK.
permissions Print the permissions from the APK.
resources Print the resource table from the APK.
configurations Print the configurations in the APK.
xmltree Print the compiled xmls in the given assets.
xmlstrings Print the strings of the given compiled xml assets.
aapt d badging filepath/..apk :显示标签、图标和应用程序的相关描述。
(这个命令很有用啊,我写过一个自动化更新下载的程序,就用到这个命令来校验应用的包名、版本和权限)
aapt d permissions filepath/..apk :显示apk所具有的系统权限
aapt d badging filepath/..apk : 显示apk的资源列表 (很多内容,如果想看最好还是转到txt里面查看吧)
aapt d configurations filepath/..apk : 显示apk的配置信息
aapt d xmltree filepath/..apk xmlname : 以树型显示apk中某个xml文件
例:以树型显示QQapk中 AndroidManifest.xml文件
aapt d xmlstrings filepath/..apk xmlname : 显示apk中某个xml文件中所有的字符
例:显示QQapk中 AndroidManifest.xml中的字符
3、编译android资源
aapt p[ackage] [-d][-f][-m][-u][-v][-x][-z][-M AndroidManifest.xml] \
[-0 extension [-0 extension ...]] [-g tolerance] [-j jarfile] \
[--debug-mode] [--min-sdk-version VAL] [--target-sdk-version VAL] \
[--app-version VAL] [--app-version-name TEXT] [--custom-package VAL] \
[--rename-manifest-package PACKAGE] \
[--rename-instrumentation-target-package PACKAGE] \
[--utf16] [--auto-add-overlay] \
[--max-res-version VAL] \
[-I base-package [-I base-package ...]] \
[-A asset-source-dir] [-G class-list-file] [-P public-definitions-file] \
[-S resource-sources [-S resource-sources ...]] \
[-F apk-file] [-J R-file-dir] \
[--product product1,product2,...] \
[-c CONFIGS] [--preferred-configurations CONFIGS] \
[-o] \
[raw-files-dir [raw-files-dir] ...]
解释:
-f 如果编译出来的文件已经存在,强制覆盖
-m 使生成的包的目录存放在-J参数指定的目录
-J 指定生成的R.java 的输出目录
-S res文件夹路径
-A assert文件夹路径
-I 某个版本平台的android.jar的路径
-F 具体指定APK文件的输出
实例:
一.将工程的资源编译到R.java文件
aapt package -m -J <R.java文件夹> -S <res路径> -I <android.jar路径> -M<AndroidManifest.xml路径>
实例:
1.cmd -- 定位到android源文件目录,如: cd E:\wirelessqa\hi --- 根据上面给出的命令套进去
<R.java文件夹> :gen\com\perf\
<res路径>: res
<android.jar路径> :
E:\Software\android-sdk-windows-1.6_r1\platforms\android-1.6\android.jar 这个要看你apk对应支持的android版本
这里有很多,找到对应的
<AndroidManifest.xml路径>: AndroidManifest.xml
OK,执行命令:
aapt p -f -m -J gen\com\perf\ -S res -I E:\Software\android-sdk-windows-1.6_r1\platforms\android-1.6\android.jar -M AndroidManifest.xml
二.将工程的资源编译到一个APK包里
aapt package -f -S <res路径> -I <android.jar路径> -A <assert路径> -M <AndroidManifest.xml路径> -F <输出的包目录+包名>
实例:
1.cmd -- 定位到android源文件目录,如: cd E:\wirelessqa\hi --- 根据上面给出的命令套进去
<res路径>: res
<android.jar路径>:
E:\Software\android-sdk-windows-1.6_r1\platforms\android-1.6\android.jar
<assert路径> :assets
<AndroidManifest.xml路径>: 当前目录下的 AndroidManifest.xml
<输出的包目录+包名>: 当前目录下 hi.apk
OK,执行命令:
aapt p -f -S res -I E:\Software\android-sdk-windows-1.6_r1\platforms\android-1.6\android.jar -A assets -M AndroidManifest.xml -F hi.apk
4. 移除打包好的apk中的文件
aapt r[emove] [-v] file.{zip,jar,apk} file1 [file2 ...]
实例:将apk中的某个文件移除掉
命令:aapt r <你的apk文件路径> <想要移除的文件名>
先从hi.apk除除AndroidManifest.xml文件,再尝试去显示,结果无法找到,证明我们已经移除成功。
5.添加文件到打包好的apk中
aapt a[dd] [-v] file.{zip,jar,apk} file1 [file2 ...]
实例:将文件添加到打包好的apk文件中
命令:aapt a <你的apk文件路径> <想要添加的文件路径>
在这里我遇到一个问题,添加文件成功之后再去尝试显示文件,结果提示文件损坏,至于是什么问题我还不知道,如果大家谁知道可以告诉我一下。
6. PNG文件预处理
aapt c[runch] [-v] -S resource-sources ... -C output-folder ... 做PNG文件的预处理,并将结果存储到一个文件夹中
实例: aapt c -S <res路径> -C <想存放的文件夹路径>
结果:
7.显示aapt版本
aapt v[ersion]
管理模拟器戒设备的端口映射
计算机和设备之间上传/下载文件
将本地apk软件安装至模拟器戒android设备
在此,需要用到的软件有:
1、android_usb_windows,设备连接电脑的驱劢包
2、ADB的工具包戒者整个SDK,adb操作的工具软件
驱劢的安装在此就丌说了,驱劢安全成功后的信息应该是这样的:
如果下载的是ADB工具包,需要做的叧是将“adb.exe”和“AdbWinApi.dll”两个文件放到“C:\Windows\System32”里即可。想知道有没有成功,可以这样操作:
1、在搜索框输入CMD,进入DOS界面
2、输入adb,如果可以的话,可以出现一大堆的东西
至此,ADB的安装就成功了,我们继续杢看看ADB常用的命令。
【常用命令详解】
1、查看设备情况
adb devices
这个命令是查看当前连接的设备, 连接到计算机的android设备戒者模拟器将会列出显示。该命令返回的结果为连接至开发机的android设备序列号及状态。序列号用于唯一标示一台android设备,通常为<设备名称>-<端口号>;状态具有如下两种:
Offline——设备没有连接到开发机戒无响应;
Device——设备已经连接到开发机。注意,该状态并丌表示android设备可用,当android设备处于启劢阶段时,若连接成功也会返回该状态。
如前所述adb首先会启劢server,该server使用5037端口进行监听,并尝试使用5555~5585端口连接Android设备/模拟器。当多台
4 / 14
android设备连接至同一开发机时,需要使用-s <序列号> 区分设备进行操作。
2、安装软件
adb install <apk文件路径>
这个命令将指定的apk文件安装到设备上。
如下图所示,我们可以先进入到软件所在的文件夹,这里在C盘下建立了个adb文件夹,里面有个APK名为autokiller,我们使用install命令杢操作:
5 / 14
adb install –r
这句命令就是重新安装该软件的意思。
3、卸载软件
adb uninstall <软件名>
adb uninstall -k <软件名>
如果加 -k 参数,为卸载软件但是保留配置和缓存文件.
4、进入设备或模拟器的shell
adb shell
6 / 14
通过上面的命令,就可以进入设备戒模拟器的shell环境中,在这个Linux Shell中,你可以执行各种Linux的命令,另外如果叧想执行一条shell命令,可以采用以下的方式:
adb shell [command]
如:adb shell dmesg就会打印出内核的调试信息。
5、发布端口
可以设置任意的端口号,做为主机向模拟器戒设备的请求端口。如:
adb forward tcp:5555 tcp:8000
6、从电脑上发送文件到设备
adb push <本地路径> <远程路径>
用push命令可以把本机电脑上的文件戒者文件夹复制到设备(手机),此处的本地就是指电脑,远程就是指手机戒者模拟器。
此处需要注意的是,电脑上的路径是“C:\”,手机上的是“/sdcard/”这样的,两处的斜杠方向丌同。
adb pull <远程路径> <本地路径>
用pull命令可以把设备(手机)上的文件戒者文件夹复制到本机电脑中。因为不命令6类似,此处丌再重复。
adb bugreport
getprop ro.carrier 查看机器的CID号 ?
10、ubuntu使用时出现的问题
在使用ubuntu时发现如下问题:使用adb devices丌能发现已经连接的android设备。产生该问题的原因在于adb命令首次运行时会启劢一个server守护进程,用于不android 设备的交互。由于ubuntu的权限问题导致该守护进程无法访问设备。因此可以以如下方式解决(注意,需将adb设置入root环境变量戒者使用全路径):
sudo adb start-server
显示守护进程启劢成功后再以adb XXX进行使用即可,丌再使用adb时可以通过
sudo adb kill-server
结束守护进程。
11、使用adb进行recovery的过程
adb shell <command> - 让手机执行命令,<command>就是手机执行的命令。如:
adb shell flash_image recovery /sd-card/recovery-RAv1.0G.img,执行将recovery-RAv1.0G.img写入到recovery 区中。
我们刷recovery时一般按下顺序执行:
adb shell mount –a
adb push recovery-RAv1.0G.img /system/recovery.img
adb push recovery-RAv1.0G.img /sdcard/recovery-RAv1.0G.img
adb shell flash_image recovery /sdcard/recovery-RAv1.0G.img reboot
【ADB命令列表】
Adb命令详表
C:\Users\milk>adb
Android Debug Bridge version 1.0.20
-d - directs command to the only connected USB device. returns an error if more than one USB device is present.
-e - directs command to the only running emulator, returns an error if more than one emulator is running.
-s <serial number> - directs command to the USB device or emulator with the given serial number
-p <product name or path> - simple product name like ‘sooner‘, or a relative/absolute path to a product out directory like ‘out/target/product/sooner‘. If -p is not specified, the ANDROID_PRODUCT_OUT environment variable is used, which must be an absolute path.
devices - list all connected devices
device commands:
adb push <local> <remote> - copy file/dir to device
adb pull <remote> <local> - copy file/dir from device
adb sync [ <directory> ] - copy host->device only if changed
(see ‘adb help all‘)
adb shell - run remote shell interactively
adb shell <command> - run remote shell command
adb emu <command> - run emulator console command
adb logcat [ <filter-spec> ] - View device log
adb forward <local> <remote> - forward socket connections
forward specs are one of:
tcp:<port>
localabstract:<unix domain socket name>
localreserved:<unix domain socket name>
localfilesystem:<unix domain socket name>
dev:<character device name>
jdwp:<process pid> (remote only)
adb jdwp - list PIDs of processes hosting a JDWP transport
adb install [-l] [-r] <file> - push this package file to the device and install it
(‘-l‘ means forward-lock the app)
(‘-r‘ means reinstall the app, keeping its data)
adb uninstall [-k] <package> - remove this app package from the device
(‘-k‘ means keep the data and cache directories)
adb bugreport - return all information from the device that
should be included in a bug report.
adb help - show this help message
adb version - show version num
DATAOPTS:
(no option) - don‘t touch the data partition
-w - wipe the data partition
-d - flash the data partition
scripting:
adb wait-for-device - block until device is online
adb start-server - ensure that there is a server running
adb kill-server - kill the server if it is running
adb get-state - prints: offline | bootloader | device
adb get-serialno - prints: <serial-number>
adb status-window - continuously print device status for a specified device
adb remount - remounts the /system partition on the device read-write
adb root - restarts adb with root permissions
networking:
adb ppp <tty> [parameters] - Run PPP over USB.
Note: you should not automatically start a PDP connection.
<tty> refers to the tty for PPP stream. Eg. dev:/dev/omap_csmi_tty1
[parameters] - Eg. defaultroute debug dump local notty usepeerdns
adb sync notes:
adb sync [ <directory> ]
- If <directory> is not specified, both /system and /data partitions will be updated.
- If it is "system" or "data", only the corresponding partition is updated.
Adb命令部分中文表
下列表格列出了adb支持的部分命令,并对它们的意义和使用方法做了说明:
分类
命令
描述
说明
Options
-d
仅仅通过USB接口杢管理abd
如果丌叧是用USB接口杢管理则返回错误
-e
仅仅通过模拟器实例杢管理adb
如果丌是叧通过模拟器实例管理则返回错误
-s <serialNumber>
<序列号>
通过模拟器/设备的允许的命令号码杢发送命令杢管理adb (比如: "emulator-5556")
如果没有指定号码,则会报错
General
devices
查看所有连接模拟器/设备的设施的清单
help
查看adb所支持的所有命令。
version
查看adb的版本序列号
Debug
logcat [<option>] [<filter-specs>]
将日志数据输出到屏幕上
12 / 14
bugreport
查看bug的报告,如dumpsys , dumpstate和logcat 信息。
jdwp
查看指定的设施的可用的JDWP信息
可以用 forward jdwp:<pid> 端口映射信息杢连接指定的JDWP进程.例如:
adb forward tcp:8000 jdwp:472
jdb -attach localhost:8000
Data
install <path-to-apk>
安装Android(可以模拟器/设施的数据文件.apk指定完整的路径)
pull <remote> <local>
将指定的文件从模拟器/设施的拷贝到电脑上
push <local> <remote>
将指定的文件从电脑上拷贝到模拟器/设备中
Ports and Networking
forward <local> <remote>
用本地指定的端口通过socket方法远程连接模拟器/设施
ppp <tty> [parm]...
通过USB运行ppp,需要提醒你的丌能自劢启劢PDP连接
Scripting
get-serialno
查看adb实例的序列号
get-state
查看模拟器/设施的当前状态
13 / 14
wait-for-device
如果设备丌联机就丌让执行,——也就是实例状态是 device 时
你可以提前把命令转载在adb的命令器中,在命令器中的命令在模拟器/设备连接之前是丌会执行其它命令的。示例如下:
adb wait-for-device shell getprop
需要提醒的是这些命令在所有的系统启劢启劢起杢之前是丌会启劢adb的,所以在所有的系统启劢起杢之前你也丌能执行其它的命令. 比如:运用install 的时候就需要Android包,这些包叧有系统完全启劢时才安装。例如:
adb wait-for-device install <app>.apk
上面的命令叧有连
14 / 14
接上了模拟器/设备连接上了adb服务才会被执行,而在Android系统完全启劢前执行就会有错误发生
Server
start-server
选择服务是否启劢adb服务进程
kill-server
终止adb服务进程
Shell
shell
通过远程shell命令杢控制模拟器/设备实例
shell [<shellCommand>]
连接模拟器/设施执行shell命令,执行完毕后退出远程shell
cmd常用控制台
1、清屏命令:cls
2、列出当前目录详细信息:dir
3、删除文件:del xxx.txt
android adb常用命令
1.创建sdcard
mksdcard 50M D:/sdcard.img --> 创建一张容量为50M的SDCard
2.删除sdcard
cd d:/
del sdcard.img
3.把ljq.txt文件放在sdcard
adb push d:/ljq.txt /sdcard/
4.创建avd模拟器
android create avd -n avd名称 -t target平台编号
eg、android create avd -n android2.1 -t 8
说明:Error: Folder C:\Users\Administrator\.android\avd\ljq.avd is in the way. Use --f
orce if you want to overwrite.(进入C:\Users\Administrator\.android\avd\目录,把ljq.avd文件夹删除即可)
5.启动模拟器
emulator -avd xxx
eg、emulator -avd android2.1
启动带sdcard模拟器
emulator -sdcard d:/sd.img -avd android2.1(android2.1之前创建好的一个虚拟设备的名称)
6.删除AVD(模拟器):
android delete avd -n name名称
eg、android delete avd -n android2.1
7.显示系统中全部android平台
android list targets
8.android list avd
9.adb devices
10.查看用户已安装的软件
adb shell
cd /data/app/
ls
11.安装软件
adb install d:\abc.apk
12.卸载软件
adb shell
cd /data/app/
adb uninstall <软件名>
adb uninstall -k <软件名>
说明:如果加 -k 参数,为卸载软件但是保留配置和缓存文件. </B>
eg、adb uninstall com.ljq.activity
13.启动ddms:ddms
14.导出文件
adb pull adb pull <远程路径> <本地路径>
eg、adb pull /sdcard/hrtx/123.gif d:/
15.导入文件
adb push <本地路径> <远程路径>
eg、adb pull d:/123.gif /sdcard/
16.进入模拟器的shell模式:
adb shell
17.在命令行中查看LOG信息:
adb logcat
adb logcat -s 标签名
eg、adb logcat -s MainActivity
18.删除系统应用:
adb remount(重新挂载系统分区,使系统分区重新可写)
adb shell
cd /system/app
rm *.apk
19.获取管理员权限:
adb root
20.启动Activity
adb shell am start -n 包名/包名+类名(-n 类名,-a action,-d date,-m MIME-TYPE,-c category,-e 扩展数据,等)
eg、adb shell am start -n com.hrtx.activity/com.hrtx.activity.MainActivity
21.发布端口:
设置任意的端口号,做为主机向模拟器或设备的请求端口。
eg、adb forward tcp:5555 tcp:8000
22.查看bug报告:
adb bugreport
23.记录无线通讯日志:
一般来说,无线通讯的日志非常多,在运行时没必要去记录,但我们还是可以通过命令设置记录:
adb shell
logcat -b radio
24.获取设备的ID和序列号:
adb get-product
adb get-serialno
25.访问数据库SQLite3
adb shell
sqlite3
Android_AIDL
1. AIDL (Android Interface DefinitionLanguage )接口描述语言
2. AIDL 适用于 进程间通信,并且与Service端多个线程并发的情况,如果只是单个线程 可以使用 Messenger ,如果不需要IPC 可以使用Binder
3. AIDL语法:基础数据类型都可以适用,List Map等有限适用。static field 不适用。
要使用AIDL我们需要两个应用程序,一个作为Service端,一个作为Client端。详细步骤如下:
基本使用步骤:
第一步:在Service端建立.aidl文件。实际实现的接口是在 gen中自动生成的对应的抽象内部类 Stub。注意:
1、导入包名,不能在src目录下创建,否则在实现的时候找到Stub类。
2、如果有使用Object对象,需要该对象 implement Parcelable 接口,并且需要导入该接口包名+类名,如果是primitivetype 不需要这步。
3、定义方法名称。
4、所有的.aidl文件以及需要传递的对象接口需要在Service 与Client中各一份,并且包名要和服务器端的一样(建议从服务器端拷贝)。
示例代码:
package com.example.android_aidl_host.aidl;
interface IRemoteService{
int getId();
void setId(int id);
}
第二步:在Service中实现.aidl 接口(通常在service中实现)。
public class MyHostService extends Service{
privateint id;
@Override
publicIBinder onBind(Intent intent) {
//TODO Auto-generated method stub
returnbind;
}
privatefinal IRemoteService.Stub bind = new IRemoteService.Stub() {
@Override
publicint getId() throws RemoteException {
//TODO Auto-generated method stub
returnid;
}
@Override
publicvoid setId(int id) throws RemoteException {
//TODO Auto-generated method stub
MyHostService.this.id= id;
}
};
}
注意:在服务器端建立好service要在manifest文件中进行注册,并且为其加上action属性。我的配置如下:
<serviceandroid:name="com.example.android_aidl_host.MyHostService">
<intent-filter>
//其它程序通过此入口获得数据,就好比ContentProvider
<actionandroid:name="com.xz.apk"/>
</intent-filter>
</service>
经过以上两步服务器的代码就已经完成了,就等其它进程来获取数据了。下面来写Client端的代码。
第一步:在Activity中通过Intent意图绑定service。
Intent service = new Intent("com.xz.apk");//必须与服务器端一致
bindService(service, new MyConn(),BIND_AUTO_CREATE);
第二步:获取服务返回的stub对象。
iService = IRemoteService.Stub.asInterface(service);
完整的Activity代码如下:
public class MainActivity extends Activity {
//aidl文件生成的java文件名
IRemoteService iService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//绑定service
Intent service = new Intent("com.xz.apk");
bindService(service, new MyConn(),BIND_AUTO_CREATE);
}
public void changId(View view) {
switch (view.getId()) {
case R.id.set://客户端的set按钮
try {
//调用服务器端的setId()方法
iService.setId(200);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
case R.id.get: //客户端的get按钮
try {
//调用服务器端的getId()方法
iService.getId();
Log.e("DDDDD",iService.getId() + "");
} catch (RemoteException e) {
e.printStackTrace();
}
break;
default:
break;
}
}
private class MyConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service){
//通过自动生成的Stub内部类,调用asInterface()方法实例化IRemoteService对象
iService =IRemoteService.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generatedmethod stub
}
}
}
Demo2:通过AIDL传递对象(Person),此实例既传递了普通数据又传递了对象。
1、定义该对象Person,并实现Parcelable。
2、添加Person.aidl文件,并采用如下方式编写导入Person
注意Person文件和Person.aidl文件必须放在同一个包中并且两者要同时存在,否则报错。
3、需要在引用到Person的.aidl文件中import+Person所在包名
4、需要在服务端和客户端都添加 Person.aidl与 Person.java文件并且需要一致。
Person类代码:
package com.example.android_aidl_mydemo_server.aidls;
import android.os.Parcel;
import android.os.Parcelable;
public class Person implements Parcelable {
String name;
int age;
//省略了相应的get和set方法
/**
* 在想要进行序列号传递的实体类内部一定要声明该常量。常量名只能是CREATOR,类型也必须是
* Parcelable.Creator<T>
*/
public static final Parcelable.Creator<Person>CREATOR = newParcelable.Creator<Person>() {
/***
* 根据序列号的Parcel对象,反序列号为原本的实体对象
* 读出顺序要和writeToParcel的写入顺序相同
*/
public Person createFromParcel(Parcel in) {
// String name =source.readString();
// int age =source.readInt();
// String sex =source.readString();
// Beauty beauty =new Beauty();
// beauty.setName(name);
// beauty.setAge(age);
// beauty.setSex(sex);
//
// returnbeauty;
return new Person(in);
}
/**
* 创建一个要序列号的实体类的数组,数组中存储的都设置为null
*/
public Person[] newArray(int size) {
return new Person[size];
}
};
public Person() { }
private Person(Parcel in) {
readFromParcel(in);
}
public int describeContents() {
return 0;
}
public void readFromParcel(Parcel in) {
age = in.readInt();
name = in.readString();
}
/**
* 将对象序列号dest 就是对象即将写入的目的对象 flags有关对象序列号的方式的标识
* 这里要注意,写入的顺序要和在createFromParcel方法中读出的顺序完全相同。例如这里先
* 写入的为name,
* 那么在createFromParcel就要先读name
*/
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(age);
dest.writeString(name);
}
}
Person.aidl文件:
packagecom.example.android_aidl_mydemo_server.aidls;
parcelable Person;
InData.aidl文件:
packagecom.example.android_aidl_mydemo_server.aidls;
import com.example.android_aidl_mydemo_server.aidls.Person;
interface InData{
String getName();
void setName(String name);
Person getPerson();
}
服务器端的service文件:
package com.example.android_aidl_mydemo_server;
import com.example.android_aidl_mydemo_server.aidls.InData;
import com.example.android_aidl_mydemo_server.aidls.Person;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
public class MyServer extends Service {
String name = "JACK";
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generatedmethod stub
returnbinder;
}
private final InData.Stub binder = new InData.Stub() {
@Override
public String getName()throws RemoteException {
// TODO Auto-generatedmethod stub
returnname;
}
@Override
public void setName(String name) throws RemoteException {
// TODO Auto-generatedmethod stub
MyServer.this.name = name;
}
@Override
publicPersongetPerson() throws RemoteException {
// TODO Auto-generatedmethod stub
Person person = new Person();
return person;
}
};
}
一说到service我又想起了一定不要忘记在manifest注册并加上action属性!
客户端MainActivity的代码:
package com.example.android_aidl_mydemo_client;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.Menu;
import com.example.android_aidl_mydemo_server.aidls.InData;
import com.example.android_aidl_mydemo_server.aidls.Person;
public class MainActivity extends Activity {
InData inData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intentservice=newIntent("com.ssss.xz.apk");
bindService(service, new MyConnection(),BIND_AUTO_CREATE);
}
private class MyConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service){
// TODO Auto-generatedmethod stub
inData=InData.Stub.asInterface(service);
try {
Log.e("SSSSSS",inData.getName());
inData.setName("Hello AIDL");
Log.e("SSSSSS",inData.getName());
Person user=inData.getPerson();
Log.e("HHHHHHHH",user.getName());
Log.e("HHHHHHHH",user.getAge()+"");
} catch (RemoteException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generatedmethod stub
inData=null;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; thisadds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}