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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值