1.我找了很多方法,以下是
《1》5.0之后 获取top activity 很多方法停用,用是可以用,但是有些条件下 获取是异常的,比如我这个是断网情况下,获取是异常的,我之前用的 是
public String getTopActivityPackageName(Context context) {
String topActivityPackage = null;
ActivityManager activityManager = (ActivityManager) (context
.getSystemService(android.content.Context.ACTIVITY_SERVICE));
List<RunningTaskInfo> runningTaskInfos = activityManager
.getRunningTasks(1);
if (runningTaskInfos != null) {
ComponentName f = runningTaskInfos.get(0).topActivity;
topActivityPackage = f.getPackageName();
}
return topActivityPackage;
}
到了断网,获取出来的就是launcher ,我去,我要的是我自己app的top acticity,这个拿到我没法用。
《2》获取权限,这个是可行的
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.dumaisoft.wxb.gettopactivity"> <application ... </application> <!--注意这里:添加权限--> <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions"/> </manifest>之后就是
//检测用户是否对本app开启了“Apps with usage access”权限 private boolean hasPermission() { AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE); int mode = 0; if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, android.os.Process.myUid(), getPackageName()); } return mode == AppOpsManager.MODE_ALLOWED; }之后
private static final int MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS = 1101; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS) { if (!hasPermission()) { //若用户未开启权限,则引导用户开启“Apps with usage access”权限 startActivityForResult( new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS), MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS); } } }
之后
private void getTopApp(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { UsageStatsManager m = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE); if (m != null) { long now = System.currentTimeMillis(); //获取60秒之内的应用数据 List<UsageStats> stats = m.queryUsageStats(UsageStatsManager.INTERVAL_BEST, now - 60 * 1000, now); Log.i(TAG, "Running app number in last 60 seconds : " + stats.size()); String topActivity = ""; //取得最近运行的一个app,即当前运行的app if ((stats != null) && (!stats.isEmpty())) { int j = 0; for (int i = 0; i < stats.size(); i++) { if (stats.get(i).getLastTimeUsed() > stats.get(j).getLastTimeUsed()) { j = i; } } topActivity = stats.get(j).getPackageName(); } Log.i(TAG, "top running app is : "+topActivity); } } }
《3》activity管理类 这个你百度 就可以看到很多,我看了一下,感觉 要写好多代码,就不想写了,我的app也不用管理
***********************************************我自己的方法了****************************************************************
在Application的onCreat中添加:
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { topActivity=activity.getClass().getName(); } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } });我想要的是类名,因为 我的程序里面要判断是否是top activity,所以我这里是String,如果你是activity,你看到了,这里也是有activity的。
在application中添加方法:
public boolean isTopActivity(String TAG){ if(TextUtils.isEmpty(topActivity)) return false; return topActivity.contains(TAG); }
大功告成。