美文网首页
Android四大组件-Service

Android四大组件-Service

作者: 雷根儿 | 来源:发表于2021-08-13 17:57 被阅读0次

今天复习Android四大组件ActivityServiceBroadcastReceiverContentProvide

二、Service

1.什么是Service
服务是一个后台运行的组件,执行连续运行且不需要用户交互的任务。甚至应用被销毁也依然可以工作。Service 是四大组件之一,必现在AndroidMainfest.xml中注册
2.Service的生命周期

Service的生命周期.png

onCreate():如果service没被创建过,调用startService()后会执行onCreate()回调;如果service已处于运行中,调用startService()不会执行onCreate()方法。也就是说,onCreate()只会在第一次创建service时候调用,多次执行startService()不会重复调用onCreate(),此方法适合完成一些初始化工作;
onStartComand():服务启动时调用,此方法适合完成一些数据加载工作,比如会在此处创建一个线程用于下载数据或播放音乐;
onBind():服务被绑定时调用;
onUnBind():服务被解绑时调用;
onDestroy():服务停止时调用;

3.Service生命周期方法

  • 启动停止service的方法:
方法 作用
startService(Intent) 启动服务
stopService(Intent) 关闭服务
bindService(Intent,ServiceConnection,flag) 绑定服务
unbindService(ServiceConnection) 解绑服务

4.生命周期调用

  • 启动服务
    startService执行的生命周期:onCreate()=>onStartComand()=>onDestroy
    注意:多次调用startService只会执行一次onCreate()会执行多次onStartComand()
  • 绑定服务
    bindService执行的生命周期:onCreate()=>onBind()=>onUnbind=>onDestroy
  • 先startService后bindService
    执行的生命周期:onCreate() =>onStartCommand()=>onBind()=>onUnbind() =>onDestroy()
  • 先bindService后StartService
    执行的生命周期:onCreate() =>onBind()=>onStartCommand()=>onUnbind() =>onDestroy()
    注意:不管是先启动服务还是先绑定服务,只要有绑定服务只有解除绑定后才能停止服务
  • 先解绑再绑定服务unbindService()、bindService()
    onUnbind(ture)=> onRebind()

5.服务的优先级
服务默认启动方式是后台服务,但是可以通过设置服务为前台服务,提高服务的优先级,进而避免手机内存紧张时,服务进程被杀掉。

  • 设置服务优先级和取消的方法如下:
//设置为前台服务
startForeground(int, Notification);
//取消为前台服务
stopForeground(true);
  • 设置前台服务案例
    ......
    ......
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        if (intent.getAction().equals("start_forceground_service")) {

//        获取NotificationManager实例
            NotificationManager notifyManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//        实例化NotificationCompat.Builder并设置相关属性
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
//                设置小图标
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
//                设置通知标题
                    .setContentTitle("我是通过startForeground 启动前台服务通知")
//                设置通知不能自动取消
                    .setAutoCancel(false)
                    .setOngoing(true)
//                设置通知时间,默认为系统发出通知的时间,通常不用设置
//                .setWhen(System.currentTimeMillis())
//               设置通知内容
                    .setContentText("请使用stopForeground 方法改为后台服务");

            //通过builder.build()方法生成Notification对象,并发送通知,id=1
//        设置为前台服务
            startForeground(1, builder.build());

        } else if (intent.getAction().equals("stop_forceground_service")) {
            
            stopForeground(true);
        }

        return super.onStartCommand(intent, flags, startId);
    }
    ......
    ......

6.如何保证Service不被杀死
从三个层面入手:

A:提供进程优先级,降低进程被杀死的概率

  • 监控手机锁屏解锁事件,在屏幕锁屏时启动1个像素的 Activity,在用户解锁时将 Activity 销毁掉。
  • 启动前台service。
  • 提升service优先级:在AndroidManifest.xml文件中对于intent-filter可以通过
    android:priority = “1000”//这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播。

B:在进程被杀死后,进行拉活。

  • 注册高频率广播接收器,唤起进程。如网络变化,解锁屏幕,开机等
  • 双进程相互唤起。
  • 依靠系统唤起。
  • onDestroy方法里重启service:service +broadcast 方式,就是当service走ondestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service;

C. 依靠第三方根据终端不同。

  • 在小米手机(包括 MIUI)接入小米推送、华为手机接入华为推送;
  • 其他手机可以考虑接入腾讯信鸽或极光推送与小米推送做 A/B Test。

三、BroadcastReceiver

相关文章

网友评论

      本文标题:Android四大组件-Service

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