另一种方式使用服务和广播

针对APP性能优化:广播和服务在不影响功能的情况下建议采用以下这两种方式:

  • LocalBroadcastManager
    • 帮助您注册并发送Intent广播,特点:更少的开销和安全
  • IntentService
    • Service处理异步请求的基础类
    • 客户端通过startService(Intent)呼叫发送请求; 该服务根据需要启动,依次使用工作线程处理每个Intent,并在停止工作时停止自身

IntentService

IntentService 是继承自 Service 并处理异步请求的一个类,在 IntentService 中有一个工作线程来处理耗时操作,当任务执行完后,IntentService 会自动停止,无需手动操作停止。如果多次启动 IntentService,则每一个耗时操作会以工作队列的方式在 IntentService 的 onHandleIntent 回调方法中依次执行。

特点优势、注意事项

  • 无需自己创建新线程执行异步方法
  • 无须管理Service生命周期,异方法执行完毕服务自动结束
  • 多次启动 IntentService 会顺序执行事件,但停止服务后,后续的事件则不会再执行(IntentService 中使用的 Handler、Looper、MessageQueue 机制把消息发送到线程中去执行的,所以多次启动 IntentService 不会重新创建新的服务和新的线程,只是把消息加入消息队列中等待执行,而如果服务停止,会清除消息队列中的消息,后续的事件得不到执行。)
  • 不能使用bindService() 启动 IntentService,强制使用后 onHandleIntent() 不会执行,这样IntentService就成为普通Service

创建IntentService

  • 继承IntentService 类
  • 实现onHandleIntent(Intent intent)方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package top.goluck.localbroadcast_2017_6_22;

    import android.app.IntentService;
    import android.content.Intent;
    import android.support.annotation.Nullable;
    import android.util.Log;

    public class WorkService extends IntentService {

    public static final String WORK_ACTION = "WorkService_ACTION";

    public WorkService() {
    super("WorkService");
    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
    Log.i("log","onHandleIntent");
    }
    }
  • AndroidManifest中 application内注册服务
    1
    2
    3
    <service 
    android:name="top.goluck.localbroadcast_2017_6_22.WorkService"
    android:exported="false"/>
  • android:exported 属性介绍
    • 外部application是否可以使用该组件(四大组件皆有这个属性)
    • 当Android sdk 的最小版本为16或者更低时他的默认值是true。如果是17和以上的版本默认值是false。
    • 相关资料

使用IntentService

  • 像启动 Service 那样启动 IntentService
    1
    2
    Intent startIntent = new Intent(getActivity(), WorkService.class);
    getActivity().startService(startIntent);

相关参考

LocalBroadcastManager

帮助您注册并发送意向广播到您的过程中的本地对象。

相比普通广播的优点

  • 你正在广播的数据不会离开你的应用程序,所以不用担心泄露私人数据。
  • 其他应用程序不可能将这些广播发送到您的应用程序,因此您不必担心可以利用安全漏洞。
  • 比通过系统发送全球广播更有效率。
  • 无系统广播的开销

Broadcast基础

  • 注册广播
    • 清单声明(静态):由此接收者可以通过AndroidManifest.xml文件进行注册。
    • 上下文注册(动态):通过Context.registerReceiver()方法 动态注册接收器。
  • 接收广播
    • 扩展BroadcastReceiver 抽象类并覆盖其onReceive()方法
    • 如果广播接收机已注册的事件发生,则接收机的onReceive()方法由Android系统调用。

创建LocalBroadcastManager

  • 兼容依赖

    1
    compile 'com.android.support:appcompat-v7:25.3.1'
  • 创建LocalBroadcastManager实例

    1
    LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
  • 创建广播接收器

    1
    2
    3
    4
    5
    6
    private BroadcastReceiver listener = new BroadcastReceiver(){
    @Override
    public void onReceive(Context context,Intent intent){
    Log.d("log","onReceive");
    }
    };

    使用LocalBroadcastManager

  • 动态注册广播

    1
    2
    IntentFilter filter = new IntentFilter(WorkService.WORK_ACTION);
    localBroadcastManager.registerReceiver(mReceiver, filter);
  • 通过LocalBroadcastManager发送本地广播

    1
    2
    3
    4
    //创建Intent
    Intent localIntent = new Intent(WorkService.WORK_ACTION);
    //发送本地广播
    localBroadcastManager.sendBroadcast(localIntent);
  • 动态注册的接收方必须不再需要的解绑

    1
    localBroadcastManager.unregisterReceiver(listener);

相关参考