项目是环境是android,编译版本是1.6,因为功能的需要,在手机使用界面activity1点击返回键/Home键,不希望activity1退出,因此调用了moveTaskToBack,将任务移到了任务栈底,但当项目需要wifi下的安装apk时,因考虑到权限的问题,需要将activity1调出到前台,然后在其上调用安装界面(需要用户手动点击安装、取消),但又要activity截获用户的点击结果(安装or取消),所以使用startActivityForResult函数。
本想使用moveTastToFront将activity1显示,但是貌似是3.0以上的版本才支持,只能放弃。
但试了多种调用activit1到前台,如下一:
Intent it1 = new Intent(context, activity1.class); it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); context.startActivity(it1);但使用FLAG_ACTIVITY_NEW_TASK标记后,startActivityForResult的结果获取不到,至少点击返回/取消获取不到(点击安装的话安装成功会有广播)
使用下面的方法(屏蔽FLAG_ACTIVITY_NEW_TASK标志),如下二:
Intent it1 = new Intent(context, activity1.class); // it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); context.startActivity(it1);调出activity1到前台时又会碰到在4.2.2系统下不能显示出来的问题,虽然在任务列表键上点击运行的任务点击activity1的apk时能在其上显示安装界面,但该界面需要用户自己点击出现,不符合要求。
最后google了几次,发现“android的activity中不能使用startAcitivity来将自己提前到stack的前面,所以startActivity的context不能是自己的Activity。”(参考链接http://hi.baidu.com/cwhxduguscbakrd/item/4358a413ad37f9f687ad4e91),根据提示,解决方法终于找到,即调用startActivity前调用下getApplicationContext(),如下:
Intent it1 = new Intent(context, activity1.class); // it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); //两种都可以 it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); context.getApplicationContext().startActivity(it1);
public static void installPackage(Context context, File file, int requestCode) { //安装列表自己控制个进度,一次安装有了结果后再进行下一个的安装 activity1.m_bInInstallProcee = true; //gxj: 如果需要,需要调出daemon到前台 if (!CommonTools.isAppOnForeground(context)) { //貌似android 3.0以上才支持,若支持,直接使用即可 // context.moveTaskToFront(); Intent it1 = new Intent(context, activity1.class); // it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); context.getApplicationContext().startActivity(it1); } if (true) { Intent intent = new Intent(); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP ); intent.setAction(android.content.Intent.ACTION_VIEW); Uri path = Uri.fromFile(file); intent.setDataAndType(path, "application/vnd.android.package-archive"); if (requestCode < android.app.Activity.RESULT_CANCELED) { context.startActivity(intent); } else { ((Activity) context).startActivityForResult(intent, requestCode); } } }其中判断当前activity是否在前台的判断如下:
public class CommonTools { public static boolean isAppOnForeground(Context context) { // Returns a list of application processes that are running on the // device ActivityManager activityManager = (ActivityManager) context.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); String packageName = context.getApplicationContext().getPackageName(); List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses(); if (appProcesses == null) return false; for (RunningAppProcessInfo appProcess : appProcesses) { // The name of the process that this object is associated with. if (appProcess.processName.equals(packageName) && appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { return true; } } return false; } }