Service如何保证服务不被杀死

1,如何保证服务不被杀死

【1】因内存资源不足而杀死Service

  • 这种情况比较容易处理,可将onStartCommand() 方法的返回值设为 START_STICKY或START_REDELIVER_INTENT ,该值表示服务在内存资源紧张时被杀死后,在内存资源足够时再恢复。也可将Service设置为前台服务,这样就有比较高的优先级,在内存资源紧张时也不会被杀掉。这两点的实现,我们在前面已分析过和实现过这里就不重复。简单代码如下:

/**

     * 返回 START_STICKY或START_REDELIVER_INTENT

     * @param intent

     * @param flags

     * @param startId

     * @return

     */

    @Override

    public int onStartCommand(Intent intent, int flags, int startId) {

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

        return START_STICKY;

    }

 

【2】用户通过 settings -> Apps -> Running -> Stop 方式杀死Service

  • 这种情况是用户手动干预的,不过幸运的是这个过程会执行Service的生命周期,也就是onDestory方法会被调用,这时便可以在 onDestory() 中发送广播重新启动。这样杀死服务后会立即启动。这种方案是行得通的,但为程序更健全,我们可开启两个服务,相互监听,相互启动。服务A监听B的广播来启动B,服务B监听A的广播来启动A。这里给出第一种方式的代码实现如下:

package com.zejian.ipctest.neverKilledService;





import android.app.Service;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.os.IBinder;

import android.support.annotation.Nullable;





/**

* Created by zejian

* Time 2016/10/4.

* Description:用户通过 settings -> Apps -> Running -> Stop 方式杀死Service

*/

public class ServiceKilledByAppStop extends Service{





    private BroadcastReceiver mReceiver;

    private IntentFilter mIF;





    @Nullable

    @Override

    public IBinder onBind(Intent intent) {

        return null;

    }





    @Override

    public void onCreate() {

        super.onCreate();

        mReceiver = new BroadcastReceiver() {

            @Override

            public void onReceive(Context context, Intent intent) {

                Intent a = new Intent(ServiceKilledByAppStop.this, ServiceKilledByAppStop.class);

                startService(a);

            }

        };

        mIF = new IntentFilter();

        //自定义action

        mIF.addAction("com.restart.service");

        //注册广播接者

        registerReceiver(mReceiver, mIF);

    }





    @Override

    public void onDestroy() {

        super.onDestroy();





        Intent intent = new Intent();

        intent.setAction("com.restart.service");

        //发送广播

        sendBroadcast(intent);





        unregisterReceiver(mReceiver);

    }

}

【3】 用户通过 settings -> Apps -> Downloaded -> Force Stop 方式强制性杀死Service 

 

这种方式就比较悲剧了,因为是直接kill运行程序的,不会走生命周期的过程,前面两种情况只要是执行Force Stop ,也就废了。也就是说这种情况下无法让服务重启,或者只能去设置Force Stop 无法操作了,不过也就没必要了,太流氓了。。。。

 

 

关于更多Service内容:https://blog.csdn.net/cricket_7/category_9580061.html

 

 

你可能感兴趣的:(Android,Service)