Android app添加后台拉起机制

本demo源码下载地址 App拉起机制源码下载

简介:

做智能售卖设备需要app一直在前台显示,但是有时由于一些不当操作或者系统原因会使app退出,导致设备不能使用。这时就需要拉起机制了。

拉起机制目前实现方式主要有2种。

1、利用Activity生命周期

创建一个类MyApp继承自Application类,在该类通过监听所有activity生命周期来判断activity是否全部销毁,以此来判断app是否退出。
代码如下:

/**
*  监听各个Activity生命周期情况
*/
private void startActivityLifeListener(){
    registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            showLog("add activity "+activity.toString());
        }

        @Override
        public void onActivityStarted(Activity activity) {
            mActivityCount++;
            showLog(activity.getComponentName()+" onActivityStarted activityCounts= "+mActivityCount);
        }

        @Override
        public void onActivityResumed(Activity activity) {

        }

        @Override
        public void onActivityPaused(Activity activity) {
            showLog(activity.getComponentName().toString()+" onActivityPaused");
        }

        @Override
        public void onActivityStopped(Activity activity) {
            mActivityCount--;
            showLog(activity.getComponentName()+" onActivityStopped activityCounts= "+mActivityCount);
            if (mActivityCount <= 0){
                // 5秒后拉起
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        showLog("try to restart");
                        Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(intent);
                    }
                }, 5000);
            }
        }

        @Override
        public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

        }

        @Override
        public void onActivityDestroyed(Activity activity) {
            showLog("remove activity "+activity.toString());
        }
    });
}

然后在onCreate方法里面调用startActivityLifeListener()方法。
在这里插入图片描述

2、利用RunningAppProcessInfo类判断

通过ActivityManager类获取所有正在运行的进程,然后利用app包名找到应用的运行进程,再判断是否处于后台,不过该方法在有些系统版本可能不能用。
创建一个远程服务类PullUpService在后台一直运行轮询检查app是否后台运行。代码如下:

package com.mhwang.apppullup;

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

import java.util.List;

/** 后台拉起服务
* Author : mhwang
* Date : 2018/11/6
* Version : V1.0
*/
public class PullUpService extends Service implements Runnable{
    private boolean running = false;
    private Intent intent;
    private Thread thread;

    private static void showLog(String s){
        Log.d("PullUpService=>", s);
    }

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

    public void onCreate(){
        super.onCreate();
        intent = getPackageManager().getLaunchIntentForPackage(getPackageName());
        if (intent != null) {
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
        showLog("onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        showLog("onStartCommand");
        if(thread == null){
            thread = new Thread(this);
            thread.start();
        }
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        showLog("onDestroy");
        running = false;
        if(thread != null && !thread.isInterrupted()){
            try {
                thread.interrupt();
                thread.join(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        thread = null;
        super.onDestroy();
    }

    @Override
    public void run() {
        running = true;
        showLog("background service start");
        while(running){
            showLog("check background");
            if(isBackground(PullUpService.this)){
                showLog("restart activity");
                startActivity(intent);
            }
            SystemClock.sleep(10 * 1000);         // 由于模拟器较卡,这里提高10秒检查一次
        }
    }

    /** 判断是否处于后台
     * @param context
     * @return true:处于后台, false:不处于后台
     */
    public static boolean isBackground(Context context) {
        ActivityManager activityManager = (ActivityManager) context
                .getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager
                .getRunningAppProcesses();
        if(appProcesses == null){
            return false;
        }
        for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
            if (appProcess.processName.equals(context.getPackageName())) {
                if (appProcess.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                    return true;
                } else {
                    return false;
                }
            }
        }
        return false;
    }

}

记得在AndroidMainifest.xml注册该服务。

<service android:name=".PullUpService" android:process=":remote"/>

然后在MyApp类开启服务:
在这里插入图片描述

如下图所示,使用back键和home键退出app,每隔5秒后都能有效拉起(图示效果运行在模拟器系统版本4.4.2)。但是有个缺点就是使用多任务键杀死时,由于此时整个app都被干掉了,因此MyApp里面的拉起机制不能生效。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值