Android Service Activity三种交互方式Word下载.docx
- 文档编号:18855092
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:14
- 大小:18.98KB
Android Service Activity三种交互方式Word下载.docx
《Android Service Activity三种交互方式Word下载.docx》由会员分享,可在线阅读,更多相关《Android Service Activity三种交互方式Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
19.@Override
20.publicvoidonCreate(){
21.super.onCreate();
22.newThread(newRunnable(){
23.
24.@Override
25.publicvoidrun(){
26.while(!
threadDisable){
27.try{
28.Thread.sleep(1000);
29.}catch(InterruptedExceptione){
30.}
31.count++;
32.Log.v("
CountService"
"
Countis"
+count);
33.}
34.}
35.}).start();
36.}
37.
38.@Override
39.publicvoidonDestroy(){
40.super.onDestroy();
41.this.threadDisable=true;
42.Log.v("
ondestroy"
);
43.}
44.
45.publicintgetCount(){
46.returncount;
47.}
48.}
复制代码
需要将该服务注册到配置文件AndroidManifest.xml中,否则无法找到:
1.<
?
xmlversion="
1.0"
encoding="
utf-8"
?
>
2.<
manifestxmlns:
android="
3.package="
com.easymorse"
4.android:
versionCode="
1"
5.android:
versionName="
>
6.<
applicationandroid:
icon="
@drawable/icon"
android:
label="
@string/app_name"
7.<
activityandroid:
name="
.LocalServiceDemoActivity"
8.android:
9.<
intent-filter>
10.<
actionandroid:
android.intent.action.MAIN"
/>
11.<
categoryandroid:
android.intent.category.LAUNCHER"
12.<
/intent-filter>
13.<
/activity>
14.<
serviceandroid:
CountService"
15.<
/application>
16.<
uses-sdkandroid:
minSdkVersion="
3"
17.<
/manifest/>
在Activity中启动和关闭本地服务。
3.importandroid.app.Activity;
5.importandroid.os.Bundle;
6.
7.publicclassLocalServiceDemoActivityextendsActivity{
8./**Calledwhentheactivityisfirstcreated.*/
9.@Override
10.publicvoidonCreate(BundlesavedInstanceState){
11.super.onCreate(savedInstanceState);
12.setContentView(R.layout.main);
14.this.startService(newIntent(this,CountService.class));
15.}
16.
17.@Override
18.protectedvoidonDestroy(){
19.super.onDestroy();
20.this.stopService(newIntent(this,CountService.class));
21.}
22.}
可通过日志查看到后台线程打印的计数内容。
编写本地服务和Activity交互的示例
上面的示例是通过startService和stopService启动关闭服务的。
适用于服务和activity之间没有调用交互的情况。
如果之间需要传递参数或者方法调用。
需要使用bind和unbind方法。
具体做法是,服务类需要增加接口,比如ICountService,另外,服务类需要有一个内部类,这样可以方便访问外部类的封装数据,这个内部类需要继承Binder类并实现ICountService接口。
还有,就是要实现Service的
onBind方法,不能只传回一个null了。
这是新建立的接口代码:
3.publicinterfaceICountService{
4.publicabstractintgetCount();
5.}
8.修改后的CountService代码:
10.packagecom.easymorse;
12.importandroid.app.Service;
13.importandroid.content.Intent;
14.importandroid.os.Binder;
15.importandroid.os.IBinder;
16.importandroid.util.Log;
17.
18.publicclassCountServiceextendsServiceimplementsICountService{
19.
20.privatebooleanthreadDisable;
21.
22.privateintcount;
24.privateServiceBinderserviceBinder=newServiceBinder();
25.
26.publicclassServiceBinderextendsBinderimplementsICountService{
27.@Override
28.publicintgetCount(){
29.returncount;
30.
31.}
32.
34.
35.@Override
36.
37.publicIBinderonBind(Intentintent){
38.returnserviceBinder;
39.}
40.
41.@Override
42.publicvoidonCreate(){
43.super.onCreate();
44.newThread(newRunnable(){
45.
46.@Override
47.publicvoidrun(){
48.while(!
49.try{
50.Thread.sleep(1000);
51.}catch(InterruptedExceptione){
52.}
53.count++;
54.Log.v("
55.}
56.}
57.}).start();
58.}
59.
60.@Override
61.publicvoidonDestroy(){
62.super.onDestroy();
63.this.threadDisable=true;
64.Log.v("
65.}
66.
67./*(non-Javadoc)
68.*@seecom.easymorse.ICountService#getCount()
69.*/
70.publicintgetCount(){
71.returncount;
72.}
73.
74.}
服务的注册也要做改动,AndroidManifest.xml文件:
4.<
5.<
6.android:
8.<
com.easymorse.CountService"
/service>
18.<
19.<
/manifest>
Acitity代码不再通过startSerivce和stopService启动关闭服务,另外,需要通过ServiceConnection的内部类实现来连接Service和Activity。
4.importandroid.content.ComponentName;
5.importandroid.content.Intent;
6.importandroid.content.ServiceConnection;
7.importandroid.os.Bundle;
8.importandroid.os.IBinder;
9.importandroid.util.Log;
10.
11.publicclassLocalServiceDemoActivityextendsActivity{
12.
13.privateServiceConnectionserviceConnection=newServiceConnection(){
14.
15.@Override
16.publicvoidonServiceConnected(ComponentNamename,IBinderservice){
17.countService=(ICountService)service;
18.Log.v("
onserivceconnected,countis"
19.+countService.getCount());
20.}
22.@Override
23.publicvoidonServiceDisconnected(ComponentNamename){
24.countService=null;
25.}
26.
27.};
28.
29.privateICountServicecountService;
31./**Calledwhentheactivityisfirstcreated.*/
32.@Override
33.publicvoidonCreate(BundlesavedInstanceState){
34.super.onCreate(savedInstanceState);
35.setContentView(R.layout.main);
36.this.bindService(newIntent("
com.easymorse.CountService"
),
37.this.serviceConnection,BIND_AUTO_CREATE);
38.}
39.
40.@Override
41.protectedvoidonDestroy(){
42.
43.this.unbindService(serviceConnection);
45.super.onDestroy();
//注意先后
46.}
编写传递基本型数据的远程服务
上面的示例,可以扩展为,让其他应用程序复用该服务。
这样的服务叫远程(remote)服务,实际上是进程间通信(RPC)。
这时需要使用android接口描述语言(AIDL)来定义远程服务的接口,而不是上述那样简单的java接口。
扩展名为aidl而不是java。
可用上面的ICountService改动而成ICountSerivde.aidl,eclipse会自动生成相关的java文件。
1.packagecom.easymorse;
3.interfaceICountService{
4.intgetCount();
5.}
编写服务(Service)类,稍有差别,主要在binder是通过远程获得的,需要通过桩(Stub)来获取。
桩对象是远程对象的本地代理。
6.importandroid.os.RemoteException;
7.importandroid.util.Log;
8.
9.publicclassCountServiceextendsService{
11.privatebooleanthreadDisable;
13.privateintcount;
15.privateICountService.StubserviceBinder=newICountService.Stub(){
18.publicintgetCount()throwsRemoteException{
19.returncount;
21.};
22.
23.@Override
24.publicIBinderonBind(Intentintent){
25.returnserviceBinder;
26.}
27.
28.@Override
29.publicvoidonCreate(){
30.super.onCreate();
31.newThread(newRunnable(){
33.@Override
34.publicvoidrun(){
35.while(!
36.try{
37.Thread.sleep(1000);
38.}catch(InterruptedExceptione){
40.count++;
41.Log.v("
42.}
44.}).start();
45.}
46.
47.@Override
48.publicvoidonDestroy(){
49.super.onDestroy();
50.this.threadDisable=true;
51.Log.v("
53.}
配置文件AndroidManifest.xml和上面的类似,没有区别。
在Activity中使用服务的差别不大,只需要对ServiceConnection中的调用远程服务的方法时,要捕获异常。
1.privateServiceConnectionserviceConnection=newServiceConnection(){
3.@Override
4.publicvoidonServiceConnected(ComponentNamename,IBinderservice){
5.countService=(ICountService)service;
6.try{
7.Log.v("
8.+countService.getCount());
9.}catch(RemoteExceptione){
10.thrownewRuntimeException(e);
11.}
12.}
15.publicvoidonServiceDisconnected(ComponentNamename){
16.countService=null;
19.};
这样就可以在同一个应用程序中使用远程服务的方式和自己定义的服务交互了。
如果是另外的应用程序使用远程服务,需要做的是复制上面的aidl文件和相应的包构到应用程序中,其他调用等都一样。
编写传递复杂数据类型的远程服务
远程服务往往不只是传递java基本数据类型。
这时需要注意android的一些限制和规定:
1.android支持String和CharSequence
2.如果需要在aidl中使用其他aidl接口类型,需要import,即使是在相同包结构下;
3.android允许传递实现Parcelable接口的类,需要import;
4.android支持集合接口类型List和Map,但是有一些限制,元素必须是基本型或者上述三种情况,不需要import集合接口类,但是需要对元素涉及到的类型import;
5.非基本数据类型,也不是String和CharSequence类型的,需要有方向指示,包括
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android Service Activity三种交互方式 Activity 交互 方式
![提示](https://static.bdocx.com/images/bang_tan.gif)