您的位置:首页 > 移动开发

【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依旧后台运行。后期得想办法改善
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: