Android创建杀不死的Service

在Android开发中我们经常会遇到一些特殊的需求需要让我们的服务常驻内存,但是会遇到各种清理软件或者用户在设置中手动停止程序的情况而导致我们的服务被异常的终止掉。虽然没有办法保证绝对的常驻内存,但是通过策略我们还是可以尽最大的可能保证服务不被杀死。

1、应对用户在设置中主动停止的case

这种情况好对付一些,我们首先新建一个TargetService来继承Service

package com.example.testundead;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.os.SystemClock;
import android.util.Log;

public class TargetService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        
        AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        //创建Intent
        Intent intent = new Intent(this, this.getClass());
        PendingIntent pendingIntent = PendingIntent.getService(this, 0,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);
        //定义开始时间
        long triggerAtTime = SystemClock.elapsedRealtime();
        //周期触发
        manager.setRepeating(AlarmManager.ELAPSED_REALTIME, triggerAtTime, 5 * 1000, pendingIntent);

        
        super.onCreate();
        Log.d("un", "Service onCreate");
    }

    @Override
    @Deprecated
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);
        Log.d("un", "Service onStart");
    }

    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("un", "Service onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Log.d("un", "Service onDestory");
        Intent i = new Intent("com.example.service_destory");
        sendBroadcast(i);
        super.onDestroy();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        // TODO Auto-generated method stub
        return super.onUnbind(intent);
    }

}

然后在Service的onDestory方法中发出广播,然后写一个广播接收器,收到此广播时可以重新启动一个Service

public class PushReciver extends BroadcastReceiver {


    @Override
    public void onReceive(Context context, Intent intent) {
        if(Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())){
            Log.d("un", "开机启动");
        }else if(Intent.ACTION_USER_PRESENT.equals(intent.getAction())){
            Log.d("un", "手机被唤醒");
            Intent i = new Intent();
            i.setClass(context, TargetService.class);
            context.startService(i);
        }else if("com.example.service_destory".equals(intent.getAction())){
            Log.d("un", "上次服务被挂了");
            Intent i = new Intent();
            i.setClass(context, TargetService.class);
            context.startService(i);
        }else if("com.example.clock".equals(intent.getAction())){
            Log.d("un", "定时闹钟的广播");
            Intent i = new Intent();
            i.setClass(context, TargetService.class);
            context.startService(i);
        }
    }
}



如上图所示,用户主动点击停止后,onDestory中的广播会被发出,可以在广播接收器中重新启动service。这种做法也比较流氓,但是对于使用清理软件是不能应对的,因为onDestory可能根本得不到执行,广播也就无从发出。

2、用对百度手机助手、QQ手机管家、360卫士等清理软件

应对清理软件的话不能使用上面的手段了,因为onDestory可能根本得不到执行。所以我们应该考虑使用其他的手段了。我理解的不死的服务不是说服务一刻也不能停止,而是说在服务被杀死后的最短时间内可以使服务重新被启动起来。

2.1使用系统的闹钟定时启动服务

在Service的onCreate方法中设置闹钟定时启动

AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        //创建Intent
        Intent intent = new Intent(this, PushReciver.class);
        intent.setAction("com.example.clock");
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);


        //周期触发
        manager.setRepeating(AlarmManager.RTC, 0, 5 * 1000, pendingIntent);
但是该方法并不是万无一失的,有时候确实会出现不能自启的现象。所以我们还需要增加其他的手段去弥补。没错,就是利用系统广播,我们可以使用静态的Receiver接收相对频繁的广播消息。

2.2在广播中重启service

我们可以接收比如系统启动、屏幕唤醒等容易发生的广播,当收到广播消息时去重启我们的服务。

<receiver android:name="com.example.testundead.PushReciver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
                <action android:name="android.intent.action.USER_PRESENT"/>
                <action android:name="com.example.service_destory"/>
            </intent-filter>
        </receiver>

至此,通过以上几种手段相结合,基本可以保证我们的服务不会出现长时间的停顿。当然以上只是基本初级的代码,具体的情况需要结合实际的项目进行探讨。

最后提供示例的下载地址:点击打开链接


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值