应⽤锁之获取栈顶Activity
如何获取当前运⾏的栈顶Activity
1、在早期的安卓版本当中,我们可以使⽤ActivityManager.
getRunningTasks⽅法来获取当前运⾏栈顶程序。
List
getInstalledPackages(0);
ActivityManagermActivityManager;
mActivityManager=(ActivityManager)temService(
TY_SERVICE);
ComponentNametopActivity=mActivityManager.
getRunningTasks(1).get(0).topActivity;
StringpackageName=kageName();
需要开启这个权限:需要注意的是:在官⽅⽂档⾥⾯明确说明,该⽅法在sdk21之后就被弃⽤了。ThismethodwasdeprecatedinAPIlevel
21.所以下⾯要介绍API21之后的实现⽅式。#2、Android5.0下如何获取栈顶Activity需要使⽤的是getRunningAppProcess⽅法来实
现。完整实现的代码如下:
Stringpackname="";/*Android5.0之后获取程序锁的⽅式是不⼀样的*/
if(_INT>20){
//5.0及其以后的版本
List
if(null!=tasks&&()>0){
packname=(0).processName;
}
}el{
//5.0之前
//获取正在运⾏的任务栈(⼀个应⽤程序占⽤⼀个任务栈)最近使⽤的任务栈会在最前⾯
//1表⽰给集合设置的最⼤容量List
//获取最近运⾏的任务栈中的栈顶Activity(即⽤户当前操作的activity)的包名
packname=(0).kageName();
}
需要说明的是,还有⼈提到了另外⼀种实现的⽅式,和这个略微不同,据说都能在Android5.0当中实现。具体的⽅式如下:
if(_INT>21){
//5.0及其以后的版本
List
if(null!=tasks&&()>0){
for(ktask:tasks){
packageName=kInfo().ponent().getPackageName();
lable=getPackageManager().getApplicationLabel(getPackageManager().getApplicationInfo(packageName,
_META_DATA)).toString();//Log.i(TAG,packageName+lable);
}
}
}
el{
//5.0之前//获取正在运⾏的任务栈(⼀个应⽤程序占⽤⼀个任务栈)最近使⽤的任务栈会在最前⾯
//1表⽰给集合设置的最⼤容量
List
//获取最近运⾏的任务栈中的栈顶Activity(即⽤户当前操作的activity)的包名
packageName=ningTasks(1).get(0).kageName();
//Log.i(TAG,packageName);
}
另外还有⼀种⽅式,⼤家可以看⼀看,不过整个第⼆种都⽤的不多,所以⼤家也没必要深究。
publicvoidupdateServiceNotification(Stringmessage){
if(!fBoolean(this,OUND,true))
return;
Stringtitle=fString(this,T,"");
Notificationn=newNotification(_default_avatar,
title,tTimeMillis());
=_ONGOING_EVENT|_NO_CLEAR;
IntentnotificationIntent=newIntent(this,);
gs(_ACTIVITY_CLEAR_TOP);
tIntent=ivity(this,0,notificationIntent,
_UPDATE_CURRENT);
estEventInfo(this,title,message,tIntent);
startForeground(SERVICE_NOTIFICATION,n);
}
RunnablemonitorStatus=newRunnable(){
publicvoidrun(){
try{
L.i("monitorStatusisrunning..."+mPackageName);
Callbacks(monitorStatus);
//如果在后台运⾏并且连接上了
if(!isAppOnForeground()){
L.i("appruninbackground...");
//
if(isAuthenticated())//不判断是否连接上了。
updateServiceNotification(getString(_bg_ticker));
return;//服务已在前台运⾏,可以停⽌重复执⾏此任务
}
el{
stopForeground(true);
}
layed(monitorStatus,1000L);
}catch(Exceptione){
tackTrace();
L.i("monitorStatus:"+sage());
}
}
}
在后来的Android5.1当中上述⽅法貌似都不能实现了,这是⾕歌出于对⽤户隐私的保护⽽采取的措施。
3、Android5.1及以上的实现⽅式使⽤的⽅法是:
sageStats
要使⽤这个⽅法,需要在⼿机设置中开启该应⽤的这个权限。⾸先需要在当中加⼊下⾯的权限:同时在⼿机当中也需要⽤户⼿动开
启该权限的开关。否则将不能获取当前运⾏的应⽤。实现的核⼼代码如下:
privateStringgetRunningApp(){
longts=tTimeMillis();
List
AL_BEST,ts-2000,ts);
if(queryUsageStats==null||y()){
returnnull;
}
UsageStatsrecentStats=null;
for(UsageStatsusageStats:queryUsageStats){
if(recentStats==null||
tTimeUd()
recentStats=usageStats;
}
}
kageName();
}
使⽤这个⽅法还有两点需要加以注意:
1、⾸先要判断应⽤是否已经获取到UsageState的权限,如果已经获取,不⽤做别的操作。
2、应⽤没获取权限,应当给出⼀个跳转的⽅式,直接跳到该设置的页⾯。针对这两个问题,下⾯将给出是否有权限和页⾯跳转的代码:
//判断调⽤该设备中“有权查看使⽤权限的应⽤”这个选项的APP有没有打开
privatebooleanisNoSwitch(){
longts=tTimeMillis();
UsageStatsManagerusageStatsManager=(UsageStatsManager)
getApplicationContext().getSystemService("usagestats");
ListqueryUsageStats=sageStats(
AL_BEST,0,ts);
if(queryUsageStats==null||y()){
returnfal;
}
returntrue;
}
//然后就是跳转的代码了:
if(isNoOption()){
lickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
Intentintent=newIntent(_USAGE_ACCESS_SETTINGS);
startActivity(intent);
}
});
⽬前⼏乎所有的应⽤锁都采⽤的第3和第1的⽅式来实现,需要加⼀个判断当前版本号的语句。在5.1之后我还没有找到别的实现⽅式,如果⼤家有
什么更好的实现⽅式,欢迎留⾔讨论。⼀个简单的应⽤锁实现,能够在安卓5.1之后的系统完美运⾏。
本文发布于:2023-03-05 22:07:40,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/1678025261150274.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:华为应用锁在哪里设置.doc
本文 PDF 下载地址:华为应用锁在哪里设置.pdf
留言与评论(共有 0 条评论) |