启动 Activity
常规的启动Activity
的方法,就是通过Intent
构建一个意图,然后通过context.startActivity()
或者context.startActivityForResult()
将活动启动起来
Intent intent = new Intent(this,MainActivity.class);
intent.putExtra("params1","a");
intent.putExtra("params2","b");
startActivity(intent);
这样写是正确的,但是就是有一个问题,就是团队开发的对接问题,如果要启动的Activity
并不是自己开发的话,那么就不清楚要传递什么数据过去.’
最佳的写法应该是下面这种
public static void startActivity(Context context,String data1,String data2){
Intent intent = new Intent(context,MainActivity.class);
intent.putExtra("params1", data1);
intent.putExtra("params2",data2);
context.startActivity(intent);
}
这样就很好的解决了数据传递问题,而不需要询问另一个页面的开发人员或者看第二个页面的代码了.
一键退出应用1
当我们的应用层次很深的时候,我们想要退出应用的时候,这时候点击back
键会一层一层的 将回退栈清空然后退出应用(正常的launchMode
),点击Home
,也只是将应用切换至后台,而不是退出,
在开发的过程中,我们一般是用一个单例类(Stack
)来管理
/**
* Created by BoBoMEe on 2015/12/30.
*/
public class ActivityStack {
private static ActivityStack instance;
private Stack<Activity> activityStack;//activity栈
private ActivityStack() {
}
//单例模式
public static ActivityStack getInstance() {
if (instance == null) {
instance = new ActivityStack();
}
return instance;
}
//把一个activity压入栈中
public void push(Activity actvity) {
if (activityStack == null) {
activityStack = new Stack<Activity>();
}
activityStack.add(actvity);
}
//获取栈顶的activity,先进后出原则
public Activity getLast() {
return activityStack.lastElement();
}
//移除一个activity
public void pop(Activity activity) {
if (activity != null && !activity.isFinishing()&&activityStack != null && activityStack.size() > 0&&activityStack.contains(activity)){
activity.finish();
activityStack.remove(activity);
}
}
//退出所有activity
public void finishAll() {
if (activityStack != null) {
while (activityStack.size() > 0) {
Activity activity = getLast();
if (activity == null) break;
pop(activity);
}
}
}
}
同时.我们需要写一个所有Activity
的基类BaseActivity
.其他Activity
都来继承这个类即可。
/**
* Created by BoBoMEe on 2015/12/30.
*/
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityStack.getInstance().push(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityStack.getInstance().pop(this);
}
}
在我们的应用中,正常返回则是将List中的Activity移除,同时,一键退出的时候,我们可以选择finishAll()方法
public void finishAll(View view){
ActivityStack.getInstance().finishAll();
}
一键退出应用2
利用的是Activity
的launchMode
和广播来实现,我们都知道Activity
中有个launchMode = singleTask
,如果设置后,跳转到相应Activity
会将其上的栈清空,调用相应Activity
的onNewIntent
方法,那么这种实现步骤如下:
- 设置
MainActivity
的加载模式为singleTask
- 重写
MainActivity
中的onNewIntent
方法 - 需要退出时在
Intent
中添加退出的tag
Manifest
<activity android:name="MainActivity" android:launchMode="singleTask"/>
MainActivity的onNewIntent
private static final String TAG_EXIT = "exit";
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent != null) {
boolean isExit = intent.getBooleanExtra(TAG_EXIT, false);
if (isExit) {
this.finish();
}
}
}
退出广播
Intent intent = new Intent(this,MainActivity.class);
intent.putExtra(MainActivity.TAG_EXIT, true);
startActivity(intent);
双击退出应用
- 再按一次退出
private long exitTime = 0;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK
&& event.getAction() == KeyEvent.ACTION_DOWN) {
if ((System.currentTimeMillis() - exitTime) > 2000) {
Toast.makeText(getApplicationContext(), "再按一次退出程序",
Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
finish();
System.exit(0);
}
return true;
}
return super.onKeyDown(keyCode, event);
}
- 对话框退出应用
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// back按键
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0
&& isStackBottomActivy(this)) {
confirmQuit(this);
return true;
}
return super.onKeyDown(keyCode, event);
}
判断当前Activity是否在栈顶
有时我们会判断当前是否处在栈顶,是栈顶的话就退出应用,否则向上回退,或者在栈顶做一些自定义操作等。
// 判断当前Activity是否是在栈顶
public static boolean isStackBottomActivy(Activity activity) {
ActivityManager manager = (ActivityManager) UIUtils.getContext().getSystemService(Context.ACTIVITY_SERVICE);
String name = manager.getRunningTasks(1).get(0).topActivity.getClassName();
return name.equals(activity.getClass().getName());
}
// 连续点击返回,退出应用
public static void confirmQuit(final Context context) {
AlertDialog.Builder build = new AlertDialog.Builder(this);
build.setTitle("系统提示").setMessage("确定要退出吗?");
build.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
build.setNegativeButton("取消",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).show();
}