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){ List usageStatses=getUsageStatsList(context,startTime,endTime); if(usageStatses==null||usageStatses.isEmpty())returnnull; for(UsageStatsusageStats:usageStatses){ if(usageStatsResult==null||usageStatsResult.getLastTimeUsed() =Build.VERSION_CODES.LOLLIPOP){ List usageStatses=getUsageStatsList(context,startTime,endTime); if(usageStatses==null||usageStatses.isEmpty())returnnull; for(UsageStatsusageStats:usageStatses){ if(TextUtils.equals(usageStats.getPackageName(),context.getPackageName())){ returnusageStats; } } } returnnull; } /** *通过UsageStatsManager获取List 集合 */ publicstaticList getUsageStatsList(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个,具体查阅源码 List usageStatses=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获取栈顶的应用包名方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。