在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中了。