美文网首页
安卓Service/IntentService/广播的应用(附带

安卓Service/IntentService/广播的应用(附带

作者: 肥得流油 | 来源:发表于2019-01-28 14:02 被阅读0次

一. Service:

Service主要有两个应用场景:后台运行和跨进程访问。
Service可以在后台执行长时间运行操作而不提供用户界面。
Service可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。
需要注意的是,Service是在主线程里执行操作的,可能会因为执行耗时操作而导致ANR。
如果要执行耗时操作,需要单独在Service中新开一个子线程,来执行耗时操作。

1.1 Service的创建:

右键-New-Service-Service(注意:不是IntentService)


image.png

通过这种方式创建之后,就会被自动注册到manifest.xml中。


image.png
如果想要手动建一个则需要建一个类,并集成Service即可。
image.png

1.2 Service的启动

startService() 启动服务
服务即处于“启动”状态。一旦启动,服务即可在后台无限期运行,即使启动服务的组件已被销毁也不受影响。 已启动的服务通常是执行单一操作,而且不会将结果返回给调用方。

    Log.i(TAG, "点击进行startService服务通信");
                Intent intent = new Intent(this, MyService.class);
                Bundle bundle = new Bundle();
                bundle.putSerializable(INTENT_KEY1,TIME_THRAED_1);
                intent.putExtras(bundle);
                startService(intent);

1.3 Service的绑定

bindService() 绑定到服务
服务即处于“绑定”状态。绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。多个组件可以同时绑定服务,服务只会在组件与其绑定时运行,一旦该服务与所有组件之间的绑定全部取消,系统便会销毁它。

1.4 Service的绑定和启动

Service既可以是启动服务,也允许绑定。
此时需要同时实现以下回调方法:onStartCommand()和 onBind()。
系统不会在所有客户端都取消绑定时销毁服务。
为此,必须通过调用 stopSelf() 或 stopService() 显式停止服务

1. 5 启动/绑定之后的Service的生命周期测试:

public class MyService extends Service {

  private int mStartMode; // 表示服务被 kill 之后的行为
  private IBinder mBinder; // 表示绑定该服务的客户端
  private boolean mAllowReind; // 表示是否允许重新绑定


  @Override public void onCreate() {
    // 服务被创建
    super.onCreate();
  }

  @Nullable @Override public IBinder onBind(Intent intent) {
    // 客户端通过 bindService() 方法绑定服务
    return mBinder;
  }

  @Override public int onStartCommand(Intent intent, int flags, int startId) {
    // 组件调用 startService() 方法启动服务
    return mStartMode;
  }

  @Override public boolean onUnbind(Intent intent) {
    // 所有绑定的客户端都已调用 unbindService() 方法解绑
    return mAllowReind;
  }

  @Override public void onRebind(Intent intent) {
    // 客户端在onUnbind() 方法回调之后,调用 bindService() 方法绑定服务
    super.onRebind(intent);
  }

  @Override public void onDestroy() {
    // 服务不再被使用并被销毁
    super.onDestroy();
  }
}

左边为StartService / 右边为BindService

二. IntentService:

Service存在的两个问题:
1.Service中的代码都是默认运行在主线程当中的,不会单独启动一条新线程,所以如果在服务中处理一些耗时任务,会产生ANR。
2.Service不会专门启动一个进程,而是与它所在的应用位于同一个进程
3.不能同时处理多个请求
对于第1点,我们可以使用多线程编程,在服务的onStartCommand方法或是BindService类的onCreate方法中中开启一个子线程去处理耗时任务,如果想要线程的任务执行完就停止服务,可以在run()的最后(任务处理完成后)调用stopSelf(),而IntentService就直接为我们创建了子线程执行耗时任务,处理异步请求的时候不需要自己去开启新的线程,可以减少写代码的工作量。

IntentService与Service不同在于:
1.IntentService创建默认的工作线程,用于在应用的主线程外执行传递给 onStartCommand() 的所有 Intent。
2.创建工作队列,用于将 Intent 逐一传递给 onHandleIntent() 实现,这样就不必担心多线程问题
3.在处理完所有启动请求后停止服务,因此不必自己调用 stopSelf()方法。
4.提供 onBind() 的默认实现(返回 null)
5.提供 onStartCommand() 的默认实现,可将 Intent 依次发送到工作队列和 onHandleIntent()

2.1 IntentService的创建:

与Service的创建同理
但请选择Service(IntentService)即可,会自动帮你继承IntentService。


image.png

通过这种方式创建之后,就会被自动注册到manifest.xml中。


image.png

如果想要手动建一个则需要建一个类,并集成IntentService即可。


image.png

IntentService的启动

        Intent intent = new Intent(this, IntentService.class);
        Bundle bundle = new Bundle();
        bundle.putString("key", "当前值:" + i++);
        intent.putExtras(bundle);
        startService(intent);

具体的Demo:https://github.com/CodeLpea/PracticceOfAndorid.git
本文对应的代码在 Number1文件夹中。

image.png

Demo中有注释。
我有什么错误或者需要交流的地方,欢迎留言或者私信哈。

相关文章

网友评论

      本文标题:安卓Service/IntentService/广播的应用(附带

      本文链接:https://www.haomeiwen.com/subject/fwvadqtx.html