android 3.0以下的版本怎么调出activity到前台

来源:互联网 发布:hybbs2.0论坛源码 编辑:程序博客网 时间:2024/06/04 10:06

项目是环境是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);


当然,因为要考虑到wifi下连续多次安装apk的情况(在用户点击安装、取消前又有新的apk安装到来),同时要兼顾获取安装结果,所以如下改动:

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// deviceActivityManager 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;}}

原创粉丝点击