Android四大组件Service后台服务前台服务IntentService跨进程服务无障碍服务系统服务.docx

上传人:b****4 文档编号:4877381 上传时间:2022-12-11 格式:DOCX 页数:14 大小:141.25KB
下载 相关 举报
Android四大组件Service后台服务前台服务IntentService跨进程服务无障碍服务系统服务.docx_第1页
第1页 / 共14页
Android四大组件Service后台服务前台服务IntentService跨进程服务无障碍服务系统服务.docx_第2页
第2页 / 共14页
Android四大组件Service后台服务前台服务IntentService跨进程服务无障碍服务系统服务.docx_第3页
第3页 / 共14页
Android四大组件Service后台服务前台服务IntentService跨进程服务无障碍服务系统服务.docx_第4页
第4页 / 共14页
Android四大组件Service后台服务前台服务IntentService跨进程服务无障碍服务系统服务.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

Android四大组件Service后台服务前台服务IntentService跨进程服务无障碍服务系统服务.docx

《Android四大组件Service后台服务前台服务IntentService跨进程服务无障碍服务系统服务.docx》由会员分享,可在线阅读,更多相关《Android四大组件Service后台服务前台服务IntentService跨进程服务无障碍服务系统服务.docx(14页珍藏版)》请在冰豆网上搜索。

Android四大组件Service后台服务前台服务IntentService跨进程服务无障碍服务系统服务.docx

Android四大组件Service后台服务前台服务IntentService跨进程服务无障碍服务系统服务

Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务

Service简介

Service是Android中实现程序后台运行的解决方案,它非常适用于去执行那些不需要和用户交互而且还要求长期运行的任务。

Service默认并不会运行在子线程中,它也不运行在一个独立的进程中,它同样执行在UI线程中,因此,不要在Service中执行耗时的操作,除非你在Service中创建了子线程来完成耗时操作

Service的运行不依赖于任何用户界面,即使程序被切换到后台或者用户打开另一个应用程序,Service仍然能够保持正常运行,这也正是Service的使用场景。

当某个应用程序进程被杀掉时,所有依赖于该进程的Service也会停止运行

后台服务

后台服务可交互性主要是体现在不同的启动服务方式,startService()和bindService()。

bindService()可以返回一个代理对象,可调用Service中的方法和获取返回结果等操作,而startService()不行

不可交互的后台服务

不可交互的后台服务即是普通的Service,Service的生命周期很简单,分别为onCreate、onStartCommand、onDestroy这三个。

当我们startService()的时候,首次创建Service会回调onCreate()方法,然后回调onStartCommand()方法,再次startService()的时候,就只会执行一次onStartCommand()。

服务一旦开启后,我们就需要通过stopService()方法或者stopSelf()方法,就能把服务关闭,这时就会回调onDestroy()

一、创建服务类

创建一个服务非常简单,只要继承Service,并实现onBind()方法

publicclassBackGroupServiceextendsService{

/**

*綁定服务时调用

*

*@paramintent

*@return

*/

@Nullable

@Override

publicIBinderonBind(Intentintent){

Log.e("Service","onBind");

returnnull;

}

/**

*服务创建时调用

*/

@Override

publicvoidonCreate(){

Log.e("Service","onCreate");

super.onCreate();

}

/**

*执行startService时调用

*

*@paramintent

*@paramflags

*@paramstartId

*@return

*/

@Override

publicintonStartCommand(Intentintent,intflags,intstartId){

Log.e("Service","onStartCommand");

//这里执行耗时操作

newThread(){

@Override

publicvoidrun(){

while(true){

try{

Log.e("Service","doSomething");

Thread.sleep(2000);

}catch(InterruptedExceptione){

e.printStackTrace();

}

}

}

}.start();

returnsuper.onStartCommand(intent,flags,startId);

}

/**

*服务被销毁时调用

*/

@Override

publicvoidonDestroy(){

Log.e("Service","onDestroy");

super.onDestroy();

}

}

二、配置服务

Service也是四大组件之一,所以必须在manifests中配置

name=".Service.BackGroupService"/>

三、启动服务和停止服务

我们通过两个按钮分别演示启动服务和停止服务,通过startService()开启服务,通过stopService()停止服务

publicclassMainActivityextendsAppCompatActivity{

Buttonbt_open,bt_close;

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

bt_open=(Button)findViewById(R.id.open);

bt_close=(Button)findViewById(R.id.close);

finalIntentintent=newIntent(this,BackGroupService.class);

bt_open.setOnClickListener(newView.OnClickListener(){

@Override

publicvoidonClick(Viewv){

//启动服务

startService(intent);

}

});

bt_close.setOnClickListener(newView.OnClickListener(){

@Override

publicvoidonClick(Viewv){

//停止服务

stopService(intent);

}

});

}

}

当你开启服务后,还有一种方法可以关闭服务,在设置中,通过应用->找到自己应用->停止

四、运行代码

运行程序后,我们点击开始服务,然后一段时间后关闭服务。

我们以Log信息来验证普通Service的生命周期:

onCreate->onStartCommand->onDestroy

11-2400:

19:

51.48316407-16407/com.handsome.boke2E/Service:

onCreate

11-2400:

19:

51.48316407-16407/com.handsome.boke2E/Service:

onStartCommand

11-2400:

19:

51.48516407-16613/com.handsome.boke2E/Service:

doSomething

11-2400:

19:

53.49016407-16613/com.handsome.boke2E/Service:

doSomething

11-2400:

19:

55.49116407-16613/com.handsome.boke2E/Service:

doSomething

11-2400:

19:

57.49116407-16613/com.handsome.boke2E/Service:

doSomething

11-2400:

19:

58.05616407-16407/com.handsome.boke2E/Service:

onDestroy

11-2400:

19:

59.49216407-16613/com.handsome.boke2E/Service:

doSomething

11-2400:

20:

01.49416407-16613/com.handsome.boke2E/Service:

doSomething

11-2400:

20:

03.49516407-16613/com.handsome.boke2E/Service:

doSomething

其中你会发现我们的子线程进行的耗时操作是一直存在的,而我们Service已经被关闭了,关闭该子线程的方法需要直接通过Home键关闭该应用程序

可交互的后台服务

可交互的后台服务是指前台页面可以调用后台服务的方法,可交互的后台服务实现步骤是和不可交互的后台服务实现步骤是一样的,区别在于启动的方式和获得Service的代理对象

一、创建服务类

和普通Service不同在于这里返回一个代理对象,返回给前台进行获取,即前台可以获取该代理对象执行后台服务的方法

publicclassBackGroupServiceextendsService{

/**

*綁定服务时调用

*

*@paramintent

*@return

*/

@Nullable

@Override

publicIBinderonBind(Intentintent){

Log.e("Service","onBind");

//返回代理对象

returnnewMyBinder();

}

/**

*代理类

*/

classMyBinderextendsBinder{

publicvoidshowToast(){

Log.e("Service","showToast");

}

publicvoidshowList(){

Log.e("Service","showList");

}

}

/**

*解除绑定服务时调用

*@paramintent

*@return

*/

@Override

publicbooleanonUnbind(Intentintent){

Log.e("Service","onUnbind");

returnsuper.onUnbind(intent);

}

/**

*服务创建时调用

*/

@Override

publicvoidonCreate(){

Log.e("Service","onCreate");

super.onCreate();

}

/**

*服务被销毁时调用

*/

@Override

publicvoidonDestroy(){

Log.e("Service","onDestroy");

super.onDestroy();

}

}

二、配置服务

name=".Service.BackGroupService"/>

三、绑定服务和解除绑定服务

我们通过两个按钮分别演示绑定服务和解除绑定服务,通过bindService()开启服务,通过unbindService()停止服务

publicclassMainActivityextendsAppCompatActivity{

Buttonbt_open,bt_close;

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

bt_open=(Button)findViewById(R.id.open);

bt_close=(Button)findViewById(R.id.close);

finalIntentintent=newIntent(this,BackGroupService.class);

bt_open.setOnClickListener(newView.OnClickListener(){

@Override

publicvoidonClick(Viewv){

bindService(intent,conn,BIND_AUTO_CREATE);

}

});

bt_close.setOnClickListener(newView.OnClickListener(){

@Orride

publicvoidonClick(Viewv){

unbindService(conn);

}

});

}

ServiceConnectionconn=newServiceConnection(){

@Override

publicvoidonServiceConnected(ComponentNamename,IBinderservice){

//拿到后台服务代理对象

BackGroupService.MyBindermyBinder=(BackGroupService.MyBinder)service;

//调用后台服务的方法

myBinder.showToast();

myBinder.showList();

}

@Override

publicvoidonServiceDisconnected(ComponentNamename){

}

};

}

这里和startService的区别在于多了一个ServiceConnection对象,该对象是用户绑定后台服务后,可获取后台服务代理对象的回调,我们可以通过该回调,拿到后台服务的代理对象,并调用后台服务定义的方法,也就实现了后台服务和前台的交互

四、运行代码

运行程序后,我们点击绑定服务,然后一段时间后解除绑定服务。

我们以Log信息来验证Service的生命周期:

onCreate->onBind->onUnBind->onDestroy,其中也可以看到我们调用后台服务的方法showToast和showList

11-2400:

55:

32.77515408-15408/com.handsome.boke2E/Service:

onCreate

11-2400:

55:

32.77515408-15408/com.handsome.boke2E/Service:

onBind

11-2400:

55:

32.79615408-15408/com.handsome.boke2E/Service:

showToast

11-2400:

55:

32.79615408-15408/com.handsome.boke2E/Service:

showList

11-2400:

55:

34.29015408-15408/com.handsome.boke2E/Service:

onUnbind

11-2400:

55:

34.29015408-15408/com.handsome.boke2E/Service:

onDestroy

混合性交互的后台服务

或许你会迷惑,startService和bindService之间有什么关系?

其实简单的说两者之间是没有关联的,类似于你亲妈生了个双胞胎一样,只有纯粹的血缘关系。

那么问题来了,这两个启动方式是否可以同时使用呢,答案是可以的

将上面两种启动方式结合起来就是混合性交互的后台服务了,即可以单独运行后台服务,也可以运行后台服务中提供的方法,其完整的生命周期是:

onCreate->onStartCommand->onBind->onUnBind->onDestroy

前台服务

由于后台服务优先级相对比较低,当系统出现内存不足的情况下,它就有可能会被回收掉,所以前台服务就是来弥补这个缺点的,它可以一直保持运行状态而不被系统回收。

例如:

墨迹天气在状态栏中的天气预报

一、创建服务类

前台服务创建很简单,其实就在Service的基础上创建一个Notification,然后使用Service的startForeground()方法即可启动为前台服务

publicclassForegroundServiceextendsService{

@Nullable

@Override

publicIBinderonBind(Intentintent){

returnnull;

}

@Override

publicvoidonCreate(){

super.onCreate();

showNotification();

}

/**

*启动前台通知

*/

privatevoidshowNotification(){

//创建通知详细信息

Notification.BuildermBuilder=newNotification.Builder(this)

.setSmallIcon(R.mipmap.ic_launcher)

.setContentTitle("2016年11月24日")

.setContentText("今天天气阴天,8到14度");

//创建点击跳转Intent

Intentintent=newIntent(this,MainActivity.class);

//创建任务栈Blder

TaskStackBuilderstackBuilder=TaskStackBuilder.create(this);

stackBuilder.addParentStack(MainActivity.class);

stackBuilder.addNextIntent(ent);

PendingIntentpendingIntent=stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);

//设置跳转Intent到通知中

mBuilder.setContentIntent(pendingIntent);

//获取通知服务

NotificationManagernm=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

//构建通知

Notificationnotification=mBuilder.build();

//显示通知

nm.notify(0,notification);

//启动为前台服务

startForeground(0,notification);

}

}

二、配置服务

name=".Service.ForegroundService"/>

三、启动前台服务

startService(newIntent(this,ForegroundService.class));

四、运行代码

我们可以看到状态栏确实增加了我们这条通知

当我们将该程序退出并杀掉的时候,通过设置->应用->选择正在运行中的应用,我们可以发现,我们的程序退出杀掉了,而服务还在进行着

IntentService

IntentService是专门用来解决Service中不能执行耗时操作这一问题的,创建一个IntentService也很简单,只要继承IntentService并覆写onHandlerIntent函数,在该函数中就可以执行耗时操作了

publicclassTheIntentServiceextendsIntentService{

publicTheIntentService(Stringname){

super(name);

}

@Override

protectedvoidonHandleIntent(Intentintent){

//在这里执行耗时操作

}

}

AIDL跨进程服务

关于AIDL跨进程服务的使用和原理分析,可以见我另一篇博客:

Android基础——初学者必知的AIDL在应用层上的Binder机制

AccessibilityService无障碍服务

关于AccessibilityService无障碍服务的使用和实例,可以见我另一篇博客:

Android进阶——学习AccessibilityService实现微信抢红包插件

系统服务

系统服务提供了很多便捷服务,可以查询Wifi、网络状态、查询电量、查询音量、查询包名、查询Application信息等等等相关多的服务,具体大家可以自信查询文档,这里举例几个常见的服务

1.判断Wifi是否开启

WifiManagerwm=(WifiManager)getSystemService(WIFI_SERVICE);

booleanenabled=wm.isWifiEnabled();

需要权限

name="android.permission.ACCESS_WIFI_STATE"/>

name="android.permission.CHANGE_WIFI_STATE"/>

2.获取系统最大音量

AudioManageram=(AudioManager)getSystemService(AUDIO_SERVICE);

intmax=am.getStreamMaxVolume(AudioManager.STREAM_SYSTEM);

3.获取当前音量

AudioManageram=(AudioManager)getSystemService(AUDIO_SERVICE);

intcurrent=am.getStreamMaxVolume(AudioManager.STREAM_RING);

4.判断网络是否有连接

ConnectivityManagercm=(ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);

NetworkInfoinfo=cm.getActiveNetworkInfo();

booleanisAvailable=info.isAvailable();

需要权限

name="android.permission.ACCESS_NETWORK_STATE"/>

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1