android 有时需要获取当前运行的包名,做相应的操作
在android 5.0之前可以使用
String topApp
ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List
topApp= rti.get(0).topActivity.getPackageName();
但是这个方法在android5.0 以后就废弃,防止应用获取更多的用户隐私
所以就需要添加废弃了如上方法 ,如果拥有系统权限则可以继续使用但是需要添加如下权限
否则需要申请相关权限
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;
}
通过如上方法判断应用是否有这个权限,没有就通过
startActivityForResult(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS),0x3000);
打开后在onActiivtyForResult里面进行相关监听
如果获取到权限后则可以通过如下方法进行获取当前运行的包名:
UsageStatsManager usm=(UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
if (usm!=null){
long now=System.currentTimeMillis();
List
if ((uStats!=null)&&(!uStats.isEmpty())){
int j = 0;
for (int i = 0; i < uStats.size(); i++) {
if (uStats.get(i).getLastTimeUsed() > uStats.get(j).getLastTimeUsed()) {
j = i;
}
}
topApp= uStats.get(j).getPackageName();
}
}
topApp 就是获取的当前运行的包名
二,在android 中时常需要悬浮窗的权限
在android6.0 之前可以直接使用windowManager addView的方式显示 ,但是到了android6.0 之后,android添加了动态权限申请机制 于是就有两种实现方法
方法一:在使用的地方申请相关权限
通过Settings.canDrawOverlays(context)方法判断悬浮窗权限是否打开
如果没有打开,则通过
startActivityForResult(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:"+getPackageName())),0x1000);
进入设置页面,打开开关,然后在onActivityResult方法中监听,如果打开就做相应处理,否则提示用户
方法二:在windowManager 初始化时,设置 type为:WindowManager.LayoutParams.TYPE_TOAST
这样就可以避免申请权限,最优解决方案