android通过什么来监听应用程序的启动

android通过什么来监听应用程序的启动,第1张

  Android中可以使用 ActivityManager来获得正在运行或者已经启动的程序,示例如下:

// 查询所有正在运行的应用程序信息: 包括他们所在的进程id和进程名  

    // 这儿我直接获取了系统里安装的所有应用程序,然后根据报名pkgname过滤获取所有真正运行的应用程序  

    private List<RunningAppInfo> queryAllRunningAppInfo() {  

        pm = this.getPackageManager()  

        // 查询所有已经安装的应用程序  

        List<ApplicationInfo> listAppcations = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES)  

        Collections.sort(listAppcations,new ApplicationInfo.DisplayNameComparator(pm))// 排序  

  

        // 保存所有正在运行的包名 以及它所在的进程信息  

        Map<String, ActivityManager.RunningAppProcessInfo> pgkProcessAppMap = new HashMap<String, ActivityManager.RunningAppProcessInfo>()  

  

        ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE)  

        // 通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程  

        List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager  

                .getRunningAppProcesses()  

  

        for (ActivityManager.RunningAppProcessInfo appProcess : appProcessList) {  

            int pid = appProcess.pid // pid  

            String processName = appProcess.processName // 进程名  

            Log.i(TAG, "processName: " + processName + "  pid: " + pid)  

  

            String[] pkgNameList = appProcess.pkgList // 获得运行在该进程里的所有应用程序包  

  

            // 输出所有应用程序的包名  

            for (int i = 0 i < pkgNameList.length i++) {  

                String pkgName = pkgNameList[i]  

                Log.i(TAG, "packageName " + pkgName + " at index " + i+ " in process " + pid)  

                // 加入至map对象里  

                pgkProcessAppMap.put(pkgName, appProcess)  

            }  

        }  

        // 保存所有正在运行的应用程序信息  

        List<RunningAppInfo> runningAppInfos = new ArrayList<RunningAppInfo>() // 保存过滤查到的AppInfo  

  

        for (ApplicationInfo app : listAppcations) {  

            // 如果该包名存在 则构造一个RunningAppInfo对象  

            if (pgkProcessAppMap.containsKey(app.packageName)) {  

                // 获得该packageName的 pid 和 processName  

                int pid = pgkProcessAppMap.get(app.packageName).pid  

                String processName = pgkProcessAppMap.get(app.packageName).processName  

                runningAppInfos.add(getAppInfo(app, pid, processName))  

            }  

        }  

  

        return runningAppInfos  

  

    }

一、通过ActivityManager.RunningAppProcessInfo判断

首先,我们需要写一个BaseActivity,然后让我们应用程序的Activity都继承自BaseActivity,这样就可以统一管理,然后在BaseActivity的onResume()和onStop()方法中进行判断应用程序是否进入到后台并且是否从后台返回到了前台,直接看代码:

public class BaseActivity extends Activity {

    public static boolean isActive //全局变量

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_base)

    }

    @Override

    protected void onResume() {

        if (!isActive) {

            //app 从后台唤醒,进入前台

            isActive = true

            Log.i("ACTIVITY", "程序从后台唤醒")

        }

        super.onResume()

    }

    @Override

    protected void onStart() {

        super.onStart()

    }

    @Override

    protected void onPause() {

        super.onPause()

    }

    @Override

    protected void onStop() {

        if (!isAppOnForeground()) {

            //app 进入后台

            isActive = false//记录当前已经进入后台

            Log.i("ACTIVITY", "程序进入后台")

        }

        super.onStop()

    }

    @Override

    protected void onDestroy() {

        super.onDestroy()

    }

    /**

     * APP是否处于前台唤醒状态

     *

     * @return

     */

    public boolean isAppOnForeground() {

        ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE)

        String packageName = getApplicationContext().getPackageName()

        List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager

                .getRunningAppProcesses()

        if (appProcesses == null)

            return false

        for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {

            // The name of the process that this object is associated with.

            if (appProcess.processName.equals(packageName)

                    && appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {

                return true

            }

        }

        return false

    }

}

对于通过跨进程通信的apk,不管是客户端还是服务端,都可以进行此方法来监听耦合的进程是否异常

https://blog.csdn.net/qq_31429205/article/details/104175356

https://www.jianshu.com/p/1180886b3ff3

AMS有封装监听Process运行情况并对外开放了一个接口,供系统进程调用查看各种进程的运行情况,具体如下:


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11269610.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存