3

私は一日中電話の使用状況を監視するアプリケーションに取り組んでいます。これを行うために、デバイスの起動時に開始し、現在のフォアグラウンドアプリケーションが何であるかを確認するためにポーリングを続けるバックグラウンドサービスがあります。次のコードは、アプリケーションをクリックしてからバックアウトし、別のアプリケーションをクリックするだけで機能します。ここで、ブラウザを開いて別のWebページに移動すると、ブラウザがフォアグラウンドアプリケーションとして登録されなくなります。または、たとえば、Googleトークを開くと、現在のアクティビティとして登録されますが、メッセージを送信すると、フォアグラウンドアプリケーションとして登録されなくなります。このバグの原因は何かについての考えやアイデアはありますか?必要に応じて、追加情報を提供しますので、お知らせください。たぶん答えはこの投稿にあり、私はそれを見つけることができません。バックグラウンドタスクまたはサービスから現在のフォアグラウンドアプリケーションを決定する

public static RunningAppProcessInfo getForegroundApp() throws NameNotFoundException{
    RunningAppProcessInfo result = null, info = null;
    String currApp = null;
    am = (ActivityManager)context.getSystemService(ACTIVITY_SERVICE);
    Drawable icon = null;
List <RunningAppProcessInfo> l = am.getRunningAppProcesses();
Iterator <RunningAppProcessInfo> i = l.iterator();
PackageManager pm = context.getPackageManager();

while(i.hasNext()){
    info = i.next();
        if(info.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND && getActivityForApp(info)!=null ){

            try {
                currApp = getCurrentApplication(info);
                System.out.println(currApp);
                System.out.println(pm.getApplicationInfo(info.processName, PackageManager.GET_META_DATA));
                icon = pm.getApplicationIcon(pm.getApplicationInfo(info.processName, PackageManager.GET_META_DATA));
                System.out.println(getActivityForApp(info));
            } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            }
        }
    break;       
}

return result;

}

private static ComponentName getActivityForApp(RunningAppProcessInfo target){
    ComponentName result=null;
    ActivityManager.RunningTaskInfo info;

    if(target==null)
        return null;

    if(am==null)
        am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
    List <ActivityManager.RunningTaskInfo> l = am.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;
}
4

3 に答える 3

5

以下のコードは私のために働きます。リストの最初のタスクは、フォアグラウンドアプリケーション名を決定するために必要なものです。

ActivityManager activityManager = (ActivityManager) getSystemService(UpdateService.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> appProcesses = activityManager.getRunningTasks(1);

Log.i("MyApp", "Foreground Package: " + appProcesses.get(0).topActivity.getPackageName());
于 2011-11-14T19:23:37.380 に答える
1

答えを見つけました。私がやった方法は次のとおりです。バックグラウンド サービスから getForegroundApp() を呼び出すだけです。

   public String getForegroundApp() throws NameNotFoundException{ 

        RunningTaskInfo info = null;
        ActivityManager am;
        am = (ActivityManager)mContext.getSystemService(ACTIVITY_SERVICE);
        List<RunningTaskInfo> l = am.getRunningTasks(1000);
        System.out.println(l);
        Iterator <RunningTaskInfo> i = l.iterator();


        String packName = new String();
        String appName = new String();
        ApplicationInfo appInfo = new ApplicationInfo();

        while(i.hasNext()){
            info = i.next();
            packName = info.topActivity.getPackageName();
            if(!packName.equals("com.htc.launcher") && !packName.equals("com.android.launcher")){ //this could be what is causing the problem. not sure.
                packName = info.topActivity.getPackageName();
                break;
            }
            info = i.next();
            packName= info.topActivity.getPackageName();
            break;          
            }
        return packName;
        }

これが最善の方法ではないことはわかっています。特に、リストした 2 つ以外にもランチャーが存在するため、ランチャーが開いていないことをどのように判断していますか。しかし、これは私のユースケースでうまくいくので、共有したいと思いました。

于 2011-06-29T18:47:14.203 に答える
0

これは古いスレッドですが、getRunningsTasks() は API レベル 21 で廃止されるため、getRunningsTasks() を使用した上記のソリューションは機能しないというメモをここに追加したいと思います。見る

https://developer.android.com/reference/android/app/ActivityManager

getRunningTasks(int maxNum) - このメソッドは API レベル 21 で非推奨になりました。Build.VERSION_CODES.LOLLIPOP の時点で、このメソッドはサード パーティのアプリケーションでは使用できなくなりました。 . 下位互換性のために、データの小さなサブセットを返します: 少なくとも呼び出し元自身のタスク、および場合によっては機密ではないことが知られているホームなどの他のタスクです。

于 2020-03-02T02:42:23.353 に答える