android5.0現在実行中のアプリケーションパッケージ名とアプリケーション名の取得方法
23093 ワード
android5.0現在実行中のアプリケーションパッケージ名の取得方法
ラベル:android実行スタックgetRunningTasksgetRunningAppProcess
2016-11-24 11:32
228人が読む
コメント(0)
コレクション
通報する
この記事には、次の項目が記載されています.
分類:
著者の同類の文章
X
本文はブロガーのオリジナル文章で、ブロガーの許可を得ずに転載してはならない.
最近、プロジェクトでユーザーが指定したアプリケーション(現在のプロジェクトではないアプリケーション)インタフェースにいる必要がある場合、プロンプトウィンドウが自動的にポップアップされます.トリガタイミングを判断するためには,現在のフロントアプリケーションのパケット名を判断する必要があるが,フロントアプリケーションのパケット名をどのように取得するか.
1つの自然な考え方は、現在の実行スタックのスタックトップのactivityを取得し、そのactivityのパケット名を取得し、最終的に判断することであり、次のコードが得られる.
この方法はandroid 5.0以前は問題ありませんでしたが、Android 5.0からGoogleはgetRunningTasksインタフェースの使用制限を開始しました.
以前、このインタフェースを使用するにはandroidが必要でした.permission.GET_TASKSは,独自に開発した一般的なアプリケーションであっても,その権限を宣言すればgetRunningTasksインタフェースを利用することができる.しかし5.0からは、この方式および廃棄が開始される.
アプリケーションがこのインタフェースを使用するには、Android権限を宣言する必要があります.permission.REAL_GET_TASKSでは、この権限は3つのアプリケーションに開放されていません.(Manifestで申請しても役に立たない)、システムアプリケーション(システム署名あり)はこの権限を呼び出すことができます.そこで、アプリケーションを実行するプロセス名はデフォルトでパッケージ名となっているが、プロセス情報を取得することでフロント実行アプリケーションのパッケージ名を間接的に取得できるのではないかという考え方がある.
ただし、このメソッドの前提は、フロントActivityが存在するプロセスの名前がパッケージ名であり、manifestで他のプロセス名をカスタマイズすると失効します.
以上です.
方法2:
トップ
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 を読む
ラベル:android実行スタックgetRunningTasksgetRunningAppProcess
2016-11-24 11:32
228人が読む
コメント(0)
コレクション
通報する
この記事には、次の項目が記載されています.
分類:
著者の同類の文章
X
本文はブロガーのオリジナル文章で、ブロガーの許可を得ずに転載してはならない.
最近、プロジェクトでユーザーが指定したアプリケーション(現在のプロジェクトではないアプリケーション)インタフェースにいる必要がある場合、プロンプトウィンドウが自動的にポップアップされます.トリガタイミングを判断するためには,現在のフロントアプリケーションのパケット名を判断する必要があるが,フロントアプリケーションのパケット名をどのように取得するか.
1つの自然な考え方は、現在の実行スタックのスタックトップのactivityを取得し、そのactivityのパケット名を取得し、最終的に判断することであり、次のコードが得られる.
/**
* ?
* activity, activity ,
*
* @param context
* @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) {
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
/**
*
*
* @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;
}