【android學習】檢測android主屏,並把app從後臺切換置前臺
阿新 • • 發佈:2019-02-01
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依舊後臺執行。後期得想辦法改善