組み込みアプリケーション (メッセージング、連絡先など) がいつ実行されているかを認識できる、バックグラウンドで実行されるアプリケーションが 1 つ必要です。
だから私の質問は:
アプリケーションをバックグラウンドで実行する方法。
バックグラウンド アプリケーションが、現在フォアグラウンドで実行されているアプリケーションが何であるかを知る方法。
経験者の方のご回答、大変有り難く存じます。
組み込みアプリケーション (メッセージング、連絡先など) がいつ実行されているかを認識できる、バックグラウンドで実行されるアプリケーションが 1 つ必要です。
だから私の質問は:
アプリケーションをバックグラウンドで実行する方法。
バックグラウンド アプリケーションが、現在フォアグラウンドで実行されているアプリケーションが何であるかを知る方法。
経験者の方のご回答、大変有り難く存じます。
「2.現在フォアグラウンドで実行中のアプリケーションが何であるかをバックグラウンド アプリケーションが知る方法」について。
このメソッドはgetRunningAppProcesses()
、私の経験からあらゆる種類のシステムゴミを返し、RunningAppProcessInfo.IMPORTANCE_FOREGROUND
. getRunningTasks()
代わりに使用
これは、現在のフォアグラウンド アプリケーションを識別するためにサービスで使用するコードです。非常に簡単です。
ActivityManager am = (ActivityManager) AppService.this.getSystemService(ACTIVITY_SERVICE);
// The first in the list of RunningTasks is always the foreground task.
RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0);
以上で、フォアグラウンド アプリ/アクティビティの詳細に簡単にアクセスできます。
String foregroundTaskPackageName = foregroundTaskInfo .topActivity.getPackageName();
PackageManager pm = AppService.this.getPackageManager();
PackageInfo foregroundAppPackageInfo = pm.getPackageInfo(foregroundTaskPackageName, 0);
String foregroundTaskAppName = foregroundAppPackageInfo.applicationInfo.loadLabel(pm).toString();
これには、アクティビティのメニフェストで追加のアクセス許可が必要であり、完全に機能します。
<uses-permission android:name="android.permission.GET_TASKS" />
私は難しい方法で正しい解決策を見つけなければなりませんでした。以下のコードはcyanogenmod7(タブレットの微調整)の一部であり、android 2.3.3/gingerbreadでテストされています。
メソッド:
これはうまくいけば、この問題にすべての範囲で答えます(:
private RunningAppProcessInfo getForegroundApp() {
RunningAppProcessInfo result=null, info=null;
if(mActivityManager==null)
mActivityManager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
List <RunningAppProcessInfo> l = mActivityManager.getRunningAppProcesses();
Iterator <RunningAppProcessInfo> i = l.iterator();
while(i.hasNext()){
info = i.next();
if(info.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND
&& !isRunningService(info.processName)){
result=info;
break;
}
}
return result;
}
private ComponentName getActivityForApp(RunningAppProcessInfo target){
ComponentName result=null;
ActivityManager.RunningTaskInfo info;
if(target==null)
return null;
if(mActivityManager==null)
mActivityManager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
List <ActivityManager.RunningTaskInfo> l = mActivityManager.getRunningTasks(9999);
Iterator <ActivityManager.RunningTaskInfo> i = l.iterator();
while(i.hasNext()){
info=i.next();
if(info.baseActivity.getPackageName().equals(target.processName)){
result=info.topActivity;
break;
}
}
return result;
}
private boolean isStillActive(RunningAppProcessInfo process, ComponentName activity)
{
// activity can be null in cases, where one app starts another. for example, astro
// starting rock player when a move file was clicked. we dont have an activity then,
// but the package exits as soon as back is hit. so we can ignore the activity
// in this case
if(process==null)
return false;
RunningAppProcessInfo currentFg=getForegroundApp();
ComponentName currentActivity=getActivityForApp(currentFg);
if(currentFg!=null && currentFg.processName.equals(process.processName) &&
(activity==null || currentActivity.compareTo(activity)==0))
return true;
Slog.i(TAG, "isStillActive returns false - CallerProcess: " + process.processName + " CurrentProcess: "
+ (currentFg==null ? "null" : currentFg.processName) + " CallerActivity:" + (activity==null ? "null" : activity.toString())
+ " CurrentActivity: " + (currentActivity==null ? "null" : currentActivity.toString()));
return false;
}
private boolean isRunningService(String processname){
if(processname==null || processname.isEmpty())
return false;
RunningServiceInfo service;
if(mActivityManager==null)
mActivityManager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
List <RunningServiceInfo> l = mActivityManager.getRunningServices(9999);
Iterator <RunningServiceInfo> i = l.iterator();
while(i.hasNext()){
service = i.next();
if(service.process.equals(processname))
return true;
}
return false;
}
次のコードを試してください。
ActivityManager activityManager = (ActivityManager) newContext.getSystemService( Context.ACTIVITY_SERVICE );
List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
for(RunningAppProcessInfo appProcess : appProcesses){
if(appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND){
Log.i("Foreground App", appProcess.processName);
}
}
プロセス名は、フォアグラウンドで実行されているアプリのパッケージ名です。アプリケーションのパッケージ名と比較してください。同じ場合、アプリケーションはフォアグラウンドで実行されています。
これがあなたの質問に答えることを願っています。
フォアグラウンド アプリケーションを特定するには、フォアグラウンド アプリの検出に使用できます。 https://github.com/ricvalerio/foregroundappcheckerを使用できます。デバイスの Android バージョンに応じて異なる方法を使用します。
サービスに関しては、レポは必要なコードも提供します。基本的に、android studio でサービスを作成してから、onCreate で appChecker を使用するスニペットを追加します。ただし、許可を求める必要があります。
ActivityManagerクラスは、実行中のプロセスを確認するための適切なツールです。
バックグラウンドで実行するには、通常、Serviceを使用します。
ロリポップ以上:
メインフェストに追加:
<uses-permission android:name="android.permission.GET_TASKS" />
そして、次のようにします。
if( mTaskId < 0 )
{
List<AppTask> tasks = mActivityManager.getAppTasks();
if( tasks.size() > 0 )
mTaskId = tasks.get( 0 ).getTaskInfo().id;
}
次のようにします。
int showLimit = 20;
/* Get all Tasks available (with limit set). */
ActivityManager mgr = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> allTasks = mgr.getRunningTasks(showLimit);
/* Loop through all tasks returned. */
for (ActivityManager.RunningTaskInfo aTask : allTasks)
{
Log.i("MyApp", "Task: " + aTask.baseActivity.getClassName());
if (aTask.baseActivity.getClassName().equals("com.android.email.activity.MessageList"))
running=true;
}