【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依旧后台运行。后期得想办法改善

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值