【android学习】检测android主屏,并把app从后台切换置前台
2016-12-13 11:58
615 查看
1,需求:
因为项目需求,需要将app永远保持前台运行。现已实现功能:
1)安装app后,只要到桌面,手持会自动切换到app界面。
2)记录退出界面,再次切换回app后依旧是原来的界面。
2,demo:
1)开一个线程,用于检测app界面及切换界面。
public class Thread_CheckMainInterface extends Thread { private static final String Tag = "CheckMainInterfaceThread"; private Context context; /** * 当前activity名字 */ private static String Str_currentActivityName = ""; public Thread_CheckMainInterface(Context context) { this.context = context; } @Override public void run() { try { while (true) { if (!checkActFort()) { gotoCurrentActivity(); } else { ActivityManager activityManager = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); ComponentName componentName = activityManager.getRunningTasks(1).get(0).topActivity; Str_currentActivityName = componentName.getClassName(); } sleep(500); if (Flag_isExit_CheckMainInterface.get()) { break; } } } catch (Exception e) { LogUtil.i(Tag, "run!" + e.getMessage()); } } private boolean checkActFort() { boolean result = false; try { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); /** * 1指得到系统当前正在运行的Task列表,用1来限制要获取的数量 */ List<RunningTaskInfo> tasks = activityManager.getRunningTasks(1); result = tasks.get(0).baseActivity.getPackageName().contains("com.luo"); } catch (Exception e) { LogUtil.i(Tag, "checkActFort" + e.getMessage()); } return result; } private void gotoCurrentActivity() { Intent mBootIntent = new Intent(context, MainActivity.class); switch (Str_currentActivityName) { case "com.luo.activity.WelcomeActivity": mBootIntent = new Intent(context, WelcomeActivity.class); break; case "com.luo.activity.NfcActivity": mBootIntent = new Intent(context, NfcActivity.class); break; case "com.luo.activity.MainActivity": mBootIntent = new Intent(context, MainActivity.class); break; case "com.luo.activity.ApplyActivity": mBootIntent = new Intent(context, ApplyActivity.class); break; case "com.luo.activity.HBSearchActivity": mBootIntent = new Intent(context, HBSearchActivity.class); break; case "com.luo.activity.LoginActivity": mBootIntent = new Intent(context, LoginActivity.class); break; default: break; } // 下面这句话必须加上才能开机自动运行app的界面 mBootIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(mBootIntent); } }
package com.luo.components; public class Flag_isExit_CheckMainInterface { private final static String Tag = "Flag_isExit_CheckMainInterface"; //通过标志来退出 private static volatile boolean isExit = false; //通过加锁,控制每次只有一个线程可以修改这个值 public static synchronized boolean get() { return isExit; } public static synchronized void set(boolean shouldExit) { isExit = shouldExit; } }
2)将线程放在Service中,在app运行的时候一直检测。
/** * 检测当前主界面是否是app的界面 * 应该写成前台app * * 如果不是,则跳转至NFC界面。当然,前提是保持菜单键长按kill掉所有程序后,app不会被kill掉。这样的案例可参考微信。 * @author luo * */ public class Service_CheckMainInterface extends Service { private final static String Tag = "Service_CheckMainInterface"; /** * Service唯一抽象方法 返回值:针对Bound Service类型的Service才有用,此处直接返回null即可。 */ @Override public IBinder onBind(Intent intent) { LogUtil.i(Tag, "onBind"); return null; } @Override public void onCreate() { LogUtil.i(Tag, "onCreate"); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { LogUtil.i(Tag, "onStartCommand"); try{ Thread t = new Thread_CheckMainInterface(this); t.start(); } catch (Exception e) { LogUtil.i(Tag, "run->Listent->" + e.getMessage()); } return START_REDELIVER_INTENT; } @Override public void onDestroy() { super.onDestroy(); LogUtil.i(Tag, "onDestroy"); } }
3)在app第一个界面,启动Service
/** * 启动Service,切出界面后自动进入 */ Intent serviceIntent; serviceIntent = new Intent(this, Service_CheckMainInterface.class); startService(serviceIntent);
4)最后,一定不要忘记注册服务
<service android:name="com.xaut.wx.components.Service_CheckMainInterface" android:exported="false" > </service>
5)为了保证每次打开app的界面唯一性,给每个activity加上单例模式singleTask
<activity android:name="com.luo.activity.ApplyActivity" android:launchMode="singleTask" android:screenOrientation="portrait" android:theme="@android:style/Theme.Light.NoTitleBar" > </activity>
3,缺点:
在通过菜单键长按切换app的时候,无法检测到主屏切换,app依旧后台运行。后期得想办法改善相关文章推荐
- Android 监听app前台、后台状态切换的实现方案
- Android 点击图标使APP由后台切换至前台重新启动欢迎页的问题
- Android学习–Android app 语言切换功能
- iOS如何检测app从后台调回前台
- android 监听app进入后台以及从后台进入前台
- Android APP应用退到后台后再打开老是恢复到前台
- Android开发学习笔记-关于Android的消息推送以及前后台切换
- Android 实现微信,QQ的程序前后台切换:back键切换后台;点击通知栏恢复前台。
- Android 从前台切换到后台
- Android 如何保证App切换到后台,或页面跳转后,重新打开APP、或返回之前页面时,维持其状态不变
- Android开发系统工具类SysUtils:获取App版本号、SD卡目录、缓存目录、是否后台运行、前台可见
- Android 判断app是否在前台还是在后台运行
- Android判断App前台运行还是后台运行(运行状态)
- linux学习入门2-3——bash命令基本操作(linuxcast.net)(bash部分快捷键、uname、history、通配符、切换用户、作业管理(前台、后台运行,暂停等操作))
- android 点击返回键app切换到后台
- Android 开发: 判断自己的APP在前台还是后台
- Android学习–Android app 语言切换功能
- Android学习–Android app 语言切换功能
- app从后台切换到前台 验证手势密码
- Android App如何判断应用是否在前台还是处于后台