安卓开发系列 之启动式服务和绑定式服务

服务是无界面的APP组件,可在后台运行,作用是下载文件、缓存音乐、监听消息等,具备更简单的生命周期。
启动式服务可独立于Activity运行,完成任务后停止;
绑定式服务绑定至其它组件,绑定的Activity可与服务互动;
计划式服务在计划的时间点运行。

启动式服务:
可继承至IntentService,是简单的启动式服务;
需要覆盖onHandleIntent()方法,收到intent后在独立线程中运行;
IDE需要在AndroidMainfest.xml中声明服务;
可使用安卓系统服务NotificationManager发出通知notify()。
代码参考为:

//建立一个通知Builder
NotificationCompat.Builder builder = new NotificationCompat.Builder(this).setSmallIcon(android.R.drawable.sym_def_app_icon)
                .setContentTitle(getString(R.string.question))
                .setContentText(text)
                .setPriority(NotificationCompat.PRIORITY_HIGH)
                .setVibrate(new long[]{
    
    0,1000})
                .setAutoCancel(true);
//打开MainActivity的intent
Intent actionIntent = new Intent(this,MainActivity.class);
//准备PendingIntent
PendingIntent actionPendingIntent = PendingIntent.getActivity(this,
                0,actionIntent,PendingIntent.FLAG_CANCEL_CURRENT);
//为通知附加PendingIntent
builder.setContentIntent(actionPendingIntent);
//发出通知
NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICATION_ID,builder.build());

补充:Intent和PendingIntent的区别
PendingIntent 可以看作是对intent的包装,通常通过getActivity,getBroadcast ,getService来得到pendingintent的实例,当前activity并不能马上启动它所包含的intent,而是在外部执行 pendingintent时,调用intent;
Intent一般是用作Activity、Sercvice、BroadcastReceiver之间传递数据,而Pendingintent一般用在 Notification上,可以理解为延迟执行的intent。

PendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags)
第一个参数连接上下文的context
第二个参数是对PendingIntent的描述,请求值不同Intent就不同
第三个参数是一个Intent对象,包含跳转目标
第四个参数有4种状态

绑定式服务:
绑定式服务绑定至另一个组件,活动与服务绑定后可与服务交互,发送请求并得到结果。
代码参考为:

protected void onCreate(Bundle savedInstanceState) {
    
    
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      //Activity绑定服务,使用匿名内部类初始化
      ServiceConnection connection = new ServiceConnection() {
    
    
          //绑定服务
          @Override
          public void onServiceConnected(ComponentName name, IBinder service) {
    
    
              bound = true;
          }
          //解绑服务
          @Override
          public void onServiceDisconnected(ComponentName name) {
    
    
              bound = false;
          }
      };
}

注意:这里onServiceConnected方法中的第二个参数为IBinder接口实现的类,所有需要在调用的服务中实现IBinder接口。

参考资料:
https://blog.csdn.net/zeng622peng/article/details/6180190 Intent和PendingIntent的区别
https://www.icourse163.org/learn/BFU-1205989803?tid=1450759471&from=study#/learn/content 移动开发技术MOOC课程
https://www.cnblogs.com/lyxin/p/5995681.html PendingIntent.getActivity的使用
https://www.cnblogs.com/itcqx/p/5557241.html Android中pendingIntent的深入理解

猜你喜欢

转载自blog.csdn.net/langxiaolin/article/details/113885011