android5.0現在実行中のアプリケーションパッケージ名とアプリケーション名の取得方法


android5.0現在実行中のアプリケーションパッケージ名の取得方法
ラベル:android実行スタックgetRunningTasksgetRunningAppProcess
2016-11-24 11:32
228人が読む
コメント(0)
コレクション
通報する
この記事には、次の項目が記載されています.
分類:
著者の同類の文章
X
本文はブロガーのオリジナル文章で、ブロガーの許可を得ずに転載してはならない.
最近、プロジェクトでユーザーが指定したアプリケーション(現在のプロジェクトではないアプリケーション)インタフェースにいる必要がある場合、プロンプトウィンドウが自動的にポップアップされます.トリガタイミングを判断するためには,現在のフロントアプリケーションのパケット名を判断する必要があるが,フロントアプリケーションのパケット名をどのように取得するか.
1つの自然な考え方は、現在の実行スタックのスタックトップのactivityを取得し、そのactivityのパケット名を取得し、最終的に判断することであり、次のコードが得られる.
/**
 *  *                     activityactivity *
 * @param context
 * @return
 */
public static String getTopActivity(Context context) {
    try {
        ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        //       task1       tasktask        List runningTaskInfos = manager.getRunningTasks(1);

        if (runningTaskInfos != null && runningTaskInfos.size() != 0) {
            return (runningTaskInfos.get(0).baseActivity).getPackageName();
        }
    } catch (Exception e) {
        Log.d("GsonUtils", "Exception=" + e.toString());
    }
    return "";
}
public static String getTopActivity(Context context) {
		try {
			ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
			//       task  ,  1       task,          task  ,       
			List runningTaskInfos = manager.getRunningTasks(1);

			if (runningTaskInfos != null && runningTaskInfos.size() != 0) {
				return (runningTaskInfos.get(0).baseActivity).getPackageName();
			}
		} catch (Exception e) {
			logger.error("    :" + e);
		}
		return "";
	}

この方法はandroid 5.0以前は問題ありませんでしたが、Android 5.0からGoogleはgetRunningTasksインタフェースの使用制限を開始しました.
以前、このインタフェースを使用するにはandroidが必要でした.permission.GET_TASKSは,独自に開発した一般的なアプリケーションであっても,その権限を宣言すればgetRunningTasksインタフェースを利用することができる.しかし5.0からは、この方式および廃棄が開始される.
アプリケーションがこのインタフェースを使用するには、Android権限を宣言する必要があります.permission.REAL_GET_TASKSでは、この権限は3つのアプリケーションに開放されていません.(Manifestで申請しても役に立たない)、システムアプリケーション(システム署名あり)はこの権限を呼び出すことができます.そこで、アプリケーションを実行するプロセス名はデフォルトでパッケージ名となっているが、プロセス情報を取得することでフロント実行アプリケーションのパッケージ名を間接的に取得できるのではないかという考え方がある.
/**
 * android 5.0 *                ,                              ?
 *
 * @param context
 * @return
 */
public static String getLollipopRecentTask(Context context) {
    final int PROCESS_STATE_TOP = 2;
    try {
        //            processState        Field processStateField = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState");
        List processes = ((ActivityManager) context.getSystemService(
                Context.ACTIVITY_SERVICE)).getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo process : processes) {
            //           
            if (process.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                int state = processStateField.getInt(process);
                //processState  2
                if (state == PROCESS_STATE_TOP) {
                    String[] packname = process.pkgList;
                    return packname[0];
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return "";
}
public static String getLollipopRecentTask(Context context) {
		final int PROCESS_STATE_TOP = 2;
		try {
			//            processState,           
			Field processStateField = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState");
			List processes = ((ActivityManager) context.getSystemService(
					Context.ACTIVITY_SERVICE)).getRunningAppProcesses();
			for (ActivityManager.RunningAppProcessInfo process : processes) {
				//           
				if (process.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
					int state = processStateField.getInt(process);
					//processState  2
					if (state == PROCESS_STATE_TOP) {
						String[] packname = process.pkgList;
						return packname[0];
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}

ただし、このメソッドの前提は、フロントActivityが存在するプロセスの名前がパッケージ名であり、manifestで他のプロセス名をカスタマイズすると失効します.
以上です.
方法2:
/**
 *    android5.0                  
 *
 * @param context
 * @return
 */
public static String getPackageNameBefore(Context context) {
    ActivityManager activityManager = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
    // 1、          ,            ,1         
    //                 ,                  
    List runTaskInfos =
            activityManager.getRunningTasks(1);
    //          
    ActivityManager.RunningTaskInfo runningTaskInfo = (ActivityManager.RunningTaskInfo) runTaskInfos.get(0);
    //      Activity   
    String runningpackageName = runningTaskInfo.baseActivity.getPackageName();
    return runningpackageName;
}
/**
 * android 5.0 * @param context
 * @return
 */
public static String getCurrentPkgName(Context context) {
    ActivityManager.RunningAppProcessInfo currentInfo = null;
    Field field = null;
    int START_TASK_TO_FRONT = 2;
    String pkgName = null;
    try {
        field = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState");
    } catch (Exception e) {
        e.printStackTrace();
    }
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List appList = am.getRunningAppProcesses();
    List processes = ((ActivityManager) context.getSystemService(
            Context.ACTIVITY_SERVICE)).getRunningAppProcesses();
    for (ActivityManager.RunningAppProcessInfo app : processes) {
        if (app.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
            Integer state = null;
            try {
                state = field.getInt(app);
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (state != null && state == START_TASK_TO_FRONT) {
                currentInfo = app;
                break;
            }
        }
    }
    if (currentInfo != null) {
        pkgName = currentInfo.processName;
    }
    return pkgName;
}
/**
 *         
 *
 * @param context
 * @return
 */
public static String getAppName(Context context) {
    String appName = null;
    PackageManager packageManager = context.getPackageManager();
    try {
        ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
        //CharSequence         .
        appName = packageManager.getApplicationLabel(applicationInfo).toString();
        appName = (String) packageManager.getApplicationLabel(applicationInfo);

    } catch (Exception e) {
        e.printStackTrace();
        Log.d("GsonUtils", "Exception=" + e.toString());
        return null;
    }
    return appName;
}

トップ
0
踏む
0
 
 
前編Activity class{package/class}does not exist原因と解決方法次の簡単なロード待ちボックス私の同類の文章
androidの旅1.0(7)
http://blog.csdn.net
  • •簡単な検索入力ボックス2016-12-26 36 36
  • を読む
  • •Activity class{package/class}does not exist原因と解決方法2016-11-24読書29
  • •assetsディレクトリの下のapk 2016-11-21をインストールする方法19
  • を読む
  • •androidのメッセージメカニズム--Handlerの原理と2016-06-13を使用して84
  • を読む
  • •簡単なロード待ちボックス2016-12-23 17
  • を読む
  • •PackageManagerの基本使用2016-11-21読書77
  • •Androidでの起動サービスについて2016-11-21 22 22
  • を読む
    /**
     *         
     *
     * @param context
     * @return
     */
    public static String getAppName(Context context) {
        String appName = null;
        PackageManager packageManager = context.getPackageManager();
        try {
            ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
            //CharSequence         .
            appName = packageManager.getApplicationLabel(applicationInfo).toString();
            appName = (String) packageManager.getApplicationLabel(applicationInfo);
    
        } catch (Exception e) {
            e.printStackTrace();
            Log.d("GsonUtils", "Exception=" + e.toString());
            return null;
        }
        return appName;
    }