Androidの傍受主プロセスが殺された

3423 ワード

マルチタスクキーを押した後、すべてのプログラムをクリアしたり、単一のプログラムを殺したりした場合、この動作を傍受するには、1つのサービスで傍受することができます.
効果は次のとおりです.
マルチタスクウィンドウで、左スライドでプロセスを終了し、すべてのプロセスをクリアすると、次のコードでアプリケーションが開きます.
public class KeepLifeService extends Service {

    private static final String TAG="KeepLifeService";

    private String mPackName;
    private ActivityManager mActivityManager;

    @Override
    public void onCreate() {
        super.onCreate();
        mActivityManager =(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);

        String process=getProcessName();
        mPackName =getPackageName();
        
        boolean isRun=isRunningProcess(mActivityManager,mPackName);
        Log.i(TAG, String.format("onCreate: %s %s pid=%d uid=%d isRun=%s", mPackName,process, Process.myPid(), Process.myUid(),isRun));

        if(!isRun){
            Intent intent = getPackageManager().getLaunchIntentForPackage(mPackName);
            if(intent!=null){
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
            }
        }

    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    /**
     *         
     *
     * @return
     */
    public static String getProcessName() {
        try {
            File file = new File("/proc/" + android.os.Process.myPid() + "/" + "cmdline");
            BufferedReader mBufferedReader = new BufferedReader(new FileReader(file));
            String processName = mBufferedReader.readLine().trim();
            mBufferedReader.close();
            return processName;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     *       
     * @return
     */
    public static boolean isRunningProcess(ActivityManager manager,String processName) {
        if(manager==null)
            return false;
        List runnings = manager.getRunningAppProcesses();
        if (runnings != null) {
            for (ActivityManager.RunningAppProcessInfo info : runnings) {
                if(TextUtils.equals(info.processName,processName)){
                    return true;
                }
            }
        }
        return false;
    }

}

AndroidManifest.xmlファイル

サービスの開始
 startService(new Intent(this,KeepLifeService.class));

メインプロセスでserviceを起動し、メインプロセスを殺すと、serviceが自動的に再起動し、onCreateが再起動し、pidが異なるので、メインプロセスが殺されるのを傍受するには、serviceのoncreateでメインプロセスが生存しているかどうかを判断し、生存していない場合は殺されるので、アプリケーションまたは他のものを再起動することができます.(ここではプレゼンテーションのためにアプリケーションを再起動するのも、保活手段ですが、このような行為はよくありません.ごろつきソフトにならないでください)
キー:
ここでサービスを起動するにはstartServiceのみ、bindServiceは使用できません.
mainifestでserviceを個別のプロセス、またはサブプロセスに配置します.
 
生き残りたいなら?
これはマルチタスクページでプロセスを殺す場合にのみ適用されます.
am force-stop packageName

プロセスを殺すと、サービスは再起動されません.
そして自分のクラッシュを適用して、異常、これは
Thread.setDefaultUncaughtExceptionHandler

リスニングを行い、アプリケーションを再起動しますが、soパケット、すなわちc層がクラッシュした場合、異常はリスニングされません.この場合、上のサービスでスレッドを開き、30 sごとにメインプロセスが生存しているかどうかをチェックしてから起動するなどします.
今回のAndroidバージョン:5.1~7.1.1、その他のセルフテスト、効果があればコメントできます.