猿问

从后台任务或服务确定当前前景应用程序

从后台任务或服务确定当前前景应用程序

我希望有一个在后台运行的应用程序,它知道任何内置应用程序(消息传递、联系人等)何时运行。

所以我的问题是:

  1. 如何在后台运行我的应用程序。

  2. 我的后台应用程序如何知道当前在前台运行的应用程序是什么。

非常感谢有经验的人的回应。


慕森王
浏览 428回答 3
3回答

ABOUTYOU

我必须想出正确的解决办法。下面的代码是CyanogenMod7(平板电脑微调)的一部分,并在Android2.3.3/姜饼上进行了测试。方法:getForeoundApp-返回前台应用程序。getActivityForApp-返回找到的应用程序的活动。isStilActive-确定先前找到的应用程序是否仍然是活动应用程序。isRunningService-getFore背景应用程序的辅助函数希望这在所有方面都能解决这个问题(:private&nbsp;RunningAppProcessInfo&nbsp;getForegroundApp()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;RunningAppProcessInfo&nbsp;result=null,&nbsp;info=null; &nbsp;&nbsp;&nbsp;&nbsp;if(mActivityManager==null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mActivityManager&nbsp;=&nbsp;(ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE); &nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;<RunningAppProcessInfo>&nbsp;l&nbsp;=&nbsp;mActivityManager.getRunningAppProcesses(); &nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;<RunningAppProcessInfo>&nbsp;i&nbsp;=&nbsp;l.iterator(); &nbsp;&nbsp;&nbsp;&nbsp;while(i.hasNext()){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info&nbsp;=&nbsp;i.next(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(info.importance&nbsp;==&nbsp;RunningAppProcessInfo.IMPORTANCE_FOREGROUND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&&&nbsp;!isRunningService(info.processName)){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result=info; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result;}private&nbsp;ComponentName&nbsp;getActivityForApp(RunningAppProcessInfo&nbsp;target){ &nbsp;&nbsp;&nbsp;&nbsp;ComponentName&nbsp;result=null; &nbsp;&nbsp;&nbsp;&nbsp;ActivityManager.RunningTaskInfo&nbsp;info; &nbsp;&nbsp;&nbsp;&nbsp;if(target==null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;if(mActivityManager==null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mActivityManager&nbsp;=&nbsp;(ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE); &nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;<ActivityManager.RunningTaskInfo>&nbsp;l&nbsp;=&nbsp;mActivityManager.getRunningTasks(9999); &nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;<ActivityManager.RunningTaskInfo>&nbsp;i&nbsp;=&nbsp;l.iterator(); &nbsp;&nbsp;&nbsp;&nbsp;while(i.hasNext()){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info=i.next(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(info.baseActivity.getPackageName().equals(target.processName)){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result=info.topActivity; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result;}private&nbsp;boolean&nbsp;isStillActive(RunningAppProcessInfo&nbsp;process,&nbsp;ComponentName&nbsp;activity){ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;activity&nbsp;can&nbsp;be&nbsp;null&nbsp;in&nbsp;cases,&nbsp;where&nbsp;one&nbsp;app&nbsp;starts&nbsp;another.&nbsp;for&nbsp;example,&nbsp;astro &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;starting&nbsp;rock&nbsp;player&nbsp;when&nbsp;a&nbsp;move&nbsp;file&nbsp;was&nbsp;clicked.&nbsp;we&nbsp;dont&nbsp;have&nbsp;an&nbsp;activity&nbsp;then, &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;but&nbsp;the&nbsp;package&nbsp;exits&nbsp;as&nbsp;soon&nbsp;as&nbsp;back&nbsp;is&nbsp;hit.&nbsp;so&nbsp;we&nbsp;can&nbsp;ignore&nbsp;the&nbsp;activity &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;in&nbsp;this&nbsp;case &nbsp;&nbsp;&nbsp;&nbsp;if(process==null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;RunningAppProcessInfo&nbsp;currentFg=getForegroundApp(); &nbsp;&nbsp;&nbsp;&nbsp;ComponentName&nbsp;currentActivity=getActivityForApp(currentFg); &nbsp;&nbsp;&nbsp;&nbsp;if(currentFg!=null&nbsp;&&&nbsp;currentFg.processName.equals(process.processName)&nbsp;&& &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(activity==null&nbsp;||&nbsp;currentActivity.compareTo(activity)==0)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;Slog.i(TAG,&nbsp;"isStillActive&nbsp;returns&nbsp;false&nbsp;-&nbsp;CallerProcess:&nbsp;"&nbsp;+&nbsp;process.processName&nbsp;+&nbsp;"&nbsp;CurrentProcess:&nbsp;" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;(currentFg==null&nbsp;?&nbsp;"null"&nbsp;:&nbsp;currentFg.processName)&nbsp;+&nbsp;"&nbsp;CallerActivity:"&nbsp;+&nbsp;(activity==null&nbsp;?&nbsp;"null"&nbsp;:&nbsp;activity.toString()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"&nbsp;CurrentActivity:&nbsp;"&nbsp;+&nbsp;(currentActivity==null&nbsp;?&nbsp;"null"&nbsp;:&nbsp;currentActivity.toString())); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;}private&nbsp;boolean&nbsp;isRunningService(String&nbsp;processname){ &nbsp;&nbsp;&nbsp;&nbsp;if(processname==null&nbsp;||&nbsp;processname.isEmpty()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;RunningServiceInfo&nbsp;service; &nbsp;&nbsp;&nbsp;&nbsp;if(mActivityManager==null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mActivityManager&nbsp;=&nbsp;(ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE); &nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;<RunningServiceInfo>&nbsp;l&nbsp;=&nbsp;mActivityManager.getRunningServices(9999); &nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;<RunningServiceInfo>&nbsp;i&nbsp;=&nbsp;l.iterator(); &nbsp;&nbsp;&nbsp;&nbsp;while(i.hasNext()){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;service&nbsp;=&nbsp;i.next(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(service.process.equals(processname)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;}

慕容3067478

尝试以下代码:ActivityManager&nbsp;activityManager&nbsp;=&nbsp;(ActivityManager)&nbsp;newContext.getSystemService(&nbsp;Context.ACTIVITY_SERVICE&nbsp;); List<RunningAppProcessInfo>&nbsp;appProcesses&nbsp;=&nbsp;activityManager.getRunningAppProcesses();for(RunningAppProcessInfo&nbsp;appProcess&nbsp;:&nbsp;appProcesses){ &nbsp;&nbsp;&nbsp;&nbsp;if(appProcess.importance&nbsp;==&nbsp;RunningAppProcessInfo.IMPORTANCE_FOREGROUND){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.i("Foreground&nbsp;App",&nbsp;appProcess.processName); &nbsp;&nbsp;&nbsp;&nbsp;}}进程名是在前台运行的应用程序的包名。将其与应用程序的包名进行比较。如果是相同的,那么您的应用程序将在前台运行。我希望这能回答你的问题。
随时随地看视频慕课网APP

相关分类

Android
我要回答