最近突发奇想,想做一个给自己用的app,主要时做一些个人记录和强制停止无脑刷屏==。
在每次解锁手机或刷视频超过一定时间,后台就把自己开发的app进入前台,提醒自己的目标及可以做其他的事有什么。
网上的资料并不能完整的解决问题,然后就自己撸了一下代码。
todo 之后有空的话把这部分打包成一个uniapp的插件。
完整代码
Timer topTimer=null;
public void startTopTimer(){
stopTopTimer();
topTimer=new Timer();
TimerTask timerTask=new TimerTask() {
@Override
public void run() {
activityInTop();
}
};
topTimer.schedule(timerTask,0,500);
}
public void stopTopTimer(){
if(topTimer!=null){
topTimer.cancel();
topTimer=null;
}
}
public void activityInTop() {
/**获取ActivityManager*/
ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(ACTIVITY_SERVICE);
/**获得当前运行的task(任务)*/
int nowPosition=0;
List<ActivityManager.RunningTaskInfo> taskInfoList = activityManager.getRunningTasks(100);
for (ActivityManager.RunningTaskInfo taskInfo : taskInfoList) {
/**找到本应用的 task,并将它切换到前台*/
if (taskInfo.topActivity.getPackageName().equals(getApplicationContext().getPackageName())) {
if(nowPosition==0){
stopTopTimer();
return;
}
activityManager.moveTaskToFront(taskInfo.id, 0);
Log.d(TAG, "找到本应用的 task,并将它切换到前台");
return;
}
nowPosition++;
}
// 应用需要置顶且前台应用被关闭时,重新打开应用
Intent intent=getPackageManager().getLaunchIntentForPackage(getPackageName());
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
使用
startTopTimer();
碰到的坑
应用被关闭时,service需要拉起一个新的应用
// 应用需要置顶且前台应用被关闭时,重新打开应用
Intent intent=getPackageManager().getLaunchIntentForPackage(getPackageName());
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
moveTaskToFront需要在应用进入后台5-7s后执行
解决方案:执行moveTaskToFront方法后,判断是否成功。不成功每间隔500ms再执行一次,直到成功为止。
7 个评论
要回复文章请先登录或注册
w***@163.com
2***@qq.com
9***@qq.com
WINext (作者)
rice_z
WINext (作者)
rice_z