1. 程式人生 > >【android學習】檢測android主屏,並把app從後臺切換置前臺

【android學習】檢測android主屏,並把app從後臺切換置前臺

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依舊後臺執行。後期得想辦法改善