Android获取栈顶的应用包名方法
有时候我们需要判断栈顶的应用是否是我们的应用,于是获取栈顶的应用包名的需求就出现了。
在android5.0之前,系统提供了一套API可以实现这个功能。
ActivityManagermanager=(ActivityManager)getApplicationContext().getSystemService(ACTIVITY_SERVICE); StringcurrentClassName=manager.getRunningTasks(1).get(0).topActivity.getPackageName();
但是在android5.0之后,这个getRunningTasks()过时了,google做了限制,不让获取第三方的应用任务栈,只能获取自己的应用和Launcher桌面的包名。
当然天无绝人之路,在android5.0之后,android提供了UsageStatsManager的方式来获取栈顶的应用包名(并非直接获取,需要处理)。
UsageStatManager是一个使用情况统计管理者,通过它可以获取应用的使用情况,通过List集合来记录APP的使用情况,通过UsageStats对象可以获取包名,最后的在前台的时间,在前台的次数等等。
他需要权限:
这个权限是需要系统授权的,系统不授权获取不到数据。
下面看下实现案例:
ForegroundAppUtils:将获取前台包名等方法封装成一个工具类
publicclassForegroundAppUtil{
privatestaticfinallongEND_TIME=System.currentTimeMillis();
privatestaticfinallongTIME_INTERVAL=7*24*60*60*1000L;
privatestaticfinallongSTART_TIME=END_TIME-TIME_INTERVAL;
/**
*获取栈顶的应用包名
*/
publicstaticStringgetForegroundActivityName(Contextcontext){
StringcurrentClassName="";
if(Build.VERSION.SDK_INT=Build.VERSION_CODES.LOLLIPOP){
returnusageStats!=null?usageStats.getTotalTimeInForeground():0;
}
return0;
}
/**
*获取记录前台应用的UsageStats对象
*/
privatestaticUsageStatsgetForegroundUsageStats(Contextcontext,longstartTime,longendTime){
UsageStatsusageStatsResult=null;
if(android.os.Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){
ListusageStatses=getUsageStatsList(context,startTime,endTime);
if(usageStatses==null||usageStatses.isEmpty())returnnull;
for(UsageStatsusageStats:usageStatses){
if(usageStatsResult==null||usageStatsResult.getLastTimeUsed()=Build.VERSION_CODES.LOLLIPOP){
ListusageStatses=getUsageStatsList(context,startTime,endTime);
if(usageStatses==null||usageStatses.isEmpty())returnnull;
for(UsageStatsusageStats:usageStatses){
if(TextUtils.equals(usageStats.getPackageName(),context.getPackageName())){
returnusageStats;
}
}
}
returnnull;
}
/**
*通过UsageStatsManager获取List集合
*/
publicstaticListgetUsageStatsList(Contextcontext,longstartTime,longendTime){
if(android.os.Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){
UsageStatsManagermanager=(UsageStatsManager)context.getApplicationContext().getSystemService(Context.USAGE_STATS_SERVICE);
//UsageStatsManager.INTERVAL_WEEKLY,UsageStatsManager的参数定义了5个,具体查阅源码
ListusageStatses=manager.queryUsageStats(UsageStatsManager.INTERVAL_BEST,startTime,endTime);
if(usageStatses==null||usageStatses.size()==0){//没有权限,获取不到数据
Intentintent=newIntent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.getApplicationContext().startActivity(intent);
returnnull;
}
returnusageStatses;
}
returnnull;
}
}
在MainActivity中启动service,在service中每5秒获取一次前台应用包名。
MainActivity
publicclassMainActivityextendsAppCompatActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService(newIntent(getApplicationContext(),MyService.class));
}
}
MyService
publicclassMyServiceextendsService{
@Override
publicIBinderonBind(Intentintent){
returnnull;
}
privateHandlerhandler=newHandler();
privateRunnabler=newRunnable(){
@Override
publicvoidrun(){
StringforegroundActivityName=ForegroundAppUtil.getForegroundActivityName(getApplicationContext());
Toast.makeText(getApplicationContext(),foregroundActivityName,Toast.LENGTH_SHORT).show();
handler.postDelayed(r,5000);
}
};
@Override
publicvoidonCreate(){
super.onCreate();
}
@Override
publicintonStartCommand(Intentintent,intflags,intstartId){
handler.postDelayed(r,5000);
returnSTART_STICKY;
}
}
AndroidManifest.xml权限
以上这篇Android获取栈顶的应用包名方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
热门推荐
6 保研的祝福语简短
10 年轻20岁祝福语简短
11 朋友结婚祝福语信息简短
12 女孩婚礼贺卡祝福语简短
13 30段点歌简短祝福语
14 虎年春节祝福语图文简短
15 写给后妈祝福语大全简短
16 简短回复生日祝福语
17 校长送毕业祝福语简短
18 毕业立体贺卡祝福语简短