博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android跳转到系统Activity关闭并返回原Activity的解决办法
阅读量:6447 次
发布时间:2019-06-23

本文共 5008 字,大约阅读时间需要 16 分钟。

在Android开发时,有时因为需求,需要跳转到系统的一些页面,比如从UI中跳转到系统设置项、WIFI设置等,那要如何返回到原来的Activity中呢?

我们可以通过WindowManager来实现。原理可以简单的理解为在跳转到系统的Activity中后,在该Activity的上方添加一个按钮,然后对这个按钮添加事件。

先看看效果图

实现代码如下

CallSystemActivity.java

package com.example.callsystemactivity;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity {	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);		Init();	}		private void Init()	{		Button callSystemSet_button=(Button)findViewById(R.id.CallSystemSet_button);			callSystemSet_button.setOnClickListener(new OnClickListener() {						@Override			public void onClick(View v) {				// TODO Auto-generated method stub				WindowManagerSp windowManagerSp=new WindowManagerSp(MainActivity.this);				windowManagerSp.AddBackButton();				IntentSp.StartActivity(MainActivity.this, android.provider.Settings.ACTION_WIFI_IP_SETTINGS,false);			}		});	}}

注:

1、需要在activity_main.xml中添加一个按钮callSystemSet_button

2、WindowManager需要相应的权限,所以需要在AndroidManifest.xml中添加权限,如下

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

    <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />

WindowManagerSp.java

package com.example.callsystemactivity;import android.app.Activity;import android.content.Context;import android.view.Gravity;import android.view.View;import android.view.View.OnClickListener;import android.view.WindowManager;import android.widget.ImageView;public class WindowManagerSp {	WindowManager _winManager = null;	Activity _activity = null;	Context _context = null;	public WindowManagerSp(Activity activity) {		if (activity == null) {			return;		}		_activity = activity;		_context = _activity.getBaseContext();		_winManager = (WindowManager) _activity.getApplicationContext()				.getSystemService(_activity.WINDOW_SERVICE);	}	public void AddBackButton() {		if (_winManager == null) {			return;		}		WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();		layoutParams.gravity = Gravity.TOP | Gravity.LEFT;		layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL				| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;		layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT				| WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;		// 以下width/height/x/y不一定是最合适的,需根据实现的页面加以调整		layoutParams.width = 32;		layoutParams.height = 32;		layoutParams.x = 280;		layoutParams.y = 0;		final ImageView backButton = new ImageView(_context);			backButton.setBackgroundResource(R.drawable.back);// 请自行添加相应的背景图片		backButton.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View v) {				IntentSp.RestartActivity(_activity, false);// 在另一个类中				if (_winManager != null) {					_winManager.removeView(backButton);				}				_winManager = null;			}		});		_activity.finish();// 关闭activity,在返回时再次开启		_winManager.addView(backButton, layoutParams);	}}

IntentSp.java

package com.kitsp.contentsp;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.net.Uri;public class IntentSp {	/**	 * 	 * @param activity	 * @param isSaveActivityToHistory	 *            true:save activity to history.System may back to the activity	 *            when other activity finish. false:no save.	 */	public static void RestartActivity(Activity activity,			boolean isSaveActivityToHistory) {		if (activity == null) {			return;		}		Intent intent = new Intent();		String packageName = activity.getPackageName();		String className = activity.getLocalClassName();		String componentClassName = packageName + "." + className;		if (className != null && className.split(".").length > 0) {			componentClassName = className;		}		ComponentName componentName = new ComponentName(packageName,				componentClassName);		intent.setComponent(componentName);		if (!isSaveActivityToHistory) {			intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);//添加该标志后,让activity不保存		}		activity.startActivity(intent);		activity.finish();		return;	}/**	 * 	 * @param context	 * @param action	 * @param isSaveActivityToHistory	 *            true:save activity to history.System may back to the activity	 *            when other activity finish. false:no save.	 */	public static void StartActivity(Context context, String action,			boolean isSaveActivityToHistory) {		if (context == null || action == null) {			return;		}		Intent intent = new Intent(action);		if (!isSaveActivityToHistory) {			intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);		}		context.startActivity(intent);	}}
注:

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)是为了不让系统的activity在开启后一直存在,如果不这样处理,在点硬返回键时,才不会返回到系统的activity中。因为由A应用开启B应用的Activity,正常是无法从A中关闭B应用的Activity的,对于我们启动系统的Activity也是一样的道理。所以为了避免该问题,我们增加了flag,这样启动后的activity就不会保存到activity的堆栈中,自然在点返回时,也就不会返回到该activity中了。

转载于:https://www.cnblogs.com/sparkleDai/p/7605041.html

你可能感兴趣的文章
rabbitmq java 应用实例
查看>>
Flutter Mac下环境配置
查看>>
springCloud学习1(集中式配置管理)
查看>>
React-Amap-HOC组件封装
查看>>
我的友情链接
查看>>
node.js操作MySQL数据库
查看>>
oracle常用字段类型
查看>>
mapreduce/spark/storm/Tez 框架
查看>>
20个简化开发任务的JavaScript库
查看>>
cocos2dx通过Jni调用Android的Java层代码(上)
查看>>
Junit 小案列 基本注解
查看>>
SpringAop的使用
查看>>
自由源于自信,自信源于自律
查看>>
Linux安装与基础命令
查看>>
quick UIInput 的使用
查看>>
远程管理
查看>>
免费(学习)使用的数据库
查看>>
锁定10月10日,九州云Animbus7.0与你不见不散
查看>>
事务 C#中TransactionScope的使用方法和原理
查看>>
如何在NGINX中重定向一个网址(301 跳转)
查看>>