android开发步步为营之7:完美退出应用程序
2013-04-29 10:06
337 查看
Android程序关闭方法有多种,网上说的好几种都不可取,比如
(1)、android.os.Process.killProcess(android.os.Process.myPid());
实验证明这个方法只能关闭第一个AActivity,该方法不可取,测试手机为android
v2.21
(2)、ActivityManager
activityMgr=
(ActivityManager)CActivity.this.getSystemService(ACTIVITY_SERVICE);
activityMgr.restartPackage(getPackageName());
这个方法也是不可以的关闭应用程序的,测试手机为android
v2.21,不知道网上那些人的文章为什么说这么写可以,所以啊,搞技术还得自己多动手
目前总结的可行的方法如下:
一、 每次跳转的时候,就关闭自身这个Activity
这种方法在某个页面需要加载大量数据的情况下就不可取,因为,关闭了,下次还得重新到服务端获取。没有大量数据通信的情况下,这种情况是可取的。
Intent
intent=new Intent(AActivity.this,BActivity.class);
startActivity(intent);
AActivity.this.finish();
System.exit(0);
二、 每个activity的父类里面实现BroadCastReceiver,收到广播后关闭
实验是从AActivity.java跳转到BActivity.java,然后再跳转到CActivity.java,最后在CActivity.java,点击关闭应用程序按钮。关闭应用。然后每个Activity都继承BaseActivity.java,BaseActivity.java注册一个广播接收器,收到广播后关闭自身这个Activity,同时取消注册当前的广播接收器。实验证明这个方法是可以退出应用的,但是不完全,在管理应用程序à正在运行 里面还是可以看到当前的应用的。
第1步、父类BaseActivity.java
/**
* 父类
*/
package com.figo.helloworld;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
/**
*
@author zhuzhifei
*
*/
public class BaseActivity extends Activity {
//这样每个Activity都有个广播接收器
private
BroadcastReceiver mCloseRecver = new BroadcastReceiver() {
@Override
public
void onReceive(Context context, Intent intent) {
//
TODO Auto-generated method stub
if
("CLOSE_RECVER".equals(intent.getAction())) {
((Activity)
context).finish();
}
}
};
/**
Called when the activity is first created. */
protected
void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
IntentFilter
myIntentFilter = new IntentFilter();
myIntentFilter.addAction("CLOSE_RECVER");
// 注册广播
registerReceiver(mCloseRecver,
myIntentFilter);
}
@Override
protected
void onDestroy() {
//
TODO Auto-generated method stub
super.onDestroy();
//每个activity自己的广播接收器在关闭当前activity的时候,取消该接收器
if(mCloseRecver!=null)
{
this.unregisterReceiver(mCloseRecver);
}
}
}
第2步、任何关闭的地方发送一个关闭的广播
sendBroadcast(new Intent("CLOSE_RECVER"));
三、 最优做法:统一收集activity,退出时统一关闭
思路:每个Activity
OnCreate的时候,就加入Application的Activity数组里面去,然后任何一个地方退出的时候,调用Aplication一个exit方法,循环关闭每个Activity,同时记得System.exit(0),本实验也同方法二一样,A,B,C三个Activity,从A跳转到B,B再跳转到C,然后再C点击一个退出应用按钮,使用完全退出当前应用。
第1步、创建自己的Application.java
/**
* 管理Activity的Application
*/
package com.figo.helloworld;
import java.util.ArrayList;
import android.app.Activity;
import android.app.Application;
/**
*
@author zhuzhifei
*
*/
public class MyApplication extends Application {
private
ArrayList<Activity> allActivities = new ArrayList<Activity>();
private
static MyApplication instance;
public
static MyApplication getInstance() {
if
(instance == null) {
instance
= new MyApplication();
}
return
instance;
}
// 添加Activity到容器中
public
void addActivity(Activity activity) {
allActivities.add(activity);
}
// 遍历所有Activity并finish
public
void exit() {
for
(Activity activity : allActivities) {
activity.finish();
}
System.exit(0);//Android的程序只是让Activity
finish()掉,而单纯的finish掉,退出并不完全
instance=null;//自身也清空
}
}
第2步、创建各个Activity
A页面AActivity.java
/**
* @author zhuzhifei[/u]
*
*/
public class AActivity extends Activity
{
private Button btnA;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.a);
btnA=(Button)findViewById(R.id.btnA);
btnA.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View
v) {
//从A跳转到B页面
Intent
intent=new Intent(AActivity.this,BActivity.class);
startActivity(intent);
}
});
//当前Activity添加到Activity数组中去
MyApplication.getInstance().addActivity(this);
}
}
B页面BActivity.java
/**
* @author zhuzhifei[/u]
*
*/
public class BActivity extends BaseActivity
{
private Button btnB;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView[/u](R.layout.b);
btnB=(Button)findViewById(R.id.btnB);
btnB.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View
v) {
//从B跳转到C页面
Intent
intent=new Intent(BActivity.this,CActivity.class);
startActivity(intent);
}
});
//当前Activity添加到Activity数组中去
MyApplication.getInstance().addActivity(this);
}
}
C页面CActivity.java
/**
* @author zhuzhifei[/u]
*
*/
public class CActivity extends Activity
{
private Button btnC;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.c);
btnC=(Button)findViewById(R.id.btnC);
//退出应用程序事件
btnC.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View
v) {
//最优做法 方法一:Activity放在数组里面统一关闭
MyApplication.getInstance().exit();
//实验证明这个方法只能关闭第一个AActivity,该方法不可取,测试手机为android
v2.21
// android.os.Process.killProcess(android.os.Process.myPid());
//这个方法也是不可以的关闭应用程序的,不知道网上那些人的文章为什么还写可以,所以啊,搞技术还得自己多动手
// ActivityManager
activityMgr= (ActivityManager)CActivity.this.getSystemService(ACTIVITY_SERVICE);
// activityMgr.restartPackage(getPackageName());
//方法二:父类activity里面实现一个广播接收器,发现需要关闭的时候即关闭自己这个Activity
//实验证明当前方式是可以退出应用程序,但是在管理应用程序-->正在运行里面还可以看见当前应用
//sendBroadcast(new
Intent("CLOSE_RECVER"));
}
});
//当前Activity添加到Activity数组中去
MyApplication.getInstance().addActivity(this);
}
}
四、另外一种思路是在baseActivity.java里面的onResume()事件里面,如果发现是需要关闭程序,然后finish当前activity,因为,如果activity都不关闭,最终关闭一个的时候,会引起连锁反应,关闭一个的时候,它后面的另外一个就会到resume。具体做法是在application设置一个是否退出的变量
@Override
protected void onResume() {
super.onResume();
Boolean isExit = (Boolean) getMyApplication().get("EXIT_APP");
if (isExit != null && isExit)
{
finish();
}
}
(1)、android.os.Process.killProcess(android.os.Process.myPid());
实验证明这个方法只能关闭第一个AActivity,该方法不可取,测试手机为android
v2.21
(2)、ActivityManager
activityMgr=
(ActivityManager)CActivity.this.getSystemService(ACTIVITY_SERVICE);
activityMgr.restartPackage(getPackageName());
这个方法也是不可以的关闭应用程序的,测试手机为android
v2.21,不知道网上那些人的文章为什么说这么写可以,所以啊,搞技术还得自己多动手
目前总结的可行的方法如下:
一、 每次跳转的时候,就关闭自身这个Activity
这种方法在某个页面需要加载大量数据的情况下就不可取,因为,关闭了,下次还得重新到服务端获取。没有大量数据通信的情况下,这种情况是可取的。
Intent
intent=new Intent(AActivity.this,BActivity.class);
startActivity(intent);
AActivity.this.finish();
System.exit(0);
二、 每个activity的父类里面实现BroadCastReceiver,收到广播后关闭
实验是从AActivity.java跳转到BActivity.java,然后再跳转到CActivity.java,最后在CActivity.java,点击关闭应用程序按钮。关闭应用。然后每个Activity都继承BaseActivity.java,BaseActivity.java注册一个广播接收器,收到广播后关闭自身这个Activity,同时取消注册当前的广播接收器。实验证明这个方法是可以退出应用的,但是不完全,在管理应用程序à正在运行 里面还是可以看到当前的应用的。
第1步、父类BaseActivity.java
/**
* 父类
*/
package com.figo.helloworld;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
/**
*
@author zhuzhifei
*
*/
public class BaseActivity extends Activity {
//这样每个Activity都有个广播接收器
private
BroadcastReceiver mCloseRecver = new BroadcastReceiver() {
@Override
public
void onReceive(Context context, Intent intent) {
//
TODO Auto-generated method stub
if
("CLOSE_RECVER".equals(intent.getAction())) {
((Activity)
context).finish();
}
}
};
/**
Called when the activity is first created. */
protected
void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
IntentFilter
myIntentFilter = new IntentFilter();
myIntentFilter.addAction("CLOSE_RECVER");
// 注册广播
registerReceiver(mCloseRecver,
myIntentFilter);
}
@Override
protected
void onDestroy() {
//
TODO Auto-generated method stub
super.onDestroy();
//每个activity自己的广播接收器在关闭当前activity的时候,取消该接收器
if(mCloseRecver!=null)
{
this.unregisterReceiver(mCloseRecver);
}
}
}
第2步、任何关闭的地方发送一个关闭的广播
sendBroadcast(new Intent("CLOSE_RECVER"));
三、 最优做法:统一收集activity,退出时统一关闭
思路:每个Activity
OnCreate的时候,就加入Application的Activity数组里面去,然后任何一个地方退出的时候,调用Aplication一个exit方法,循环关闭每个Activity,同时记得System.exit(0),本实验也同方法二一样,A,B,C三个Activity,从A跳转到B,B再跳转到C,然后再C点击一个退出应用按钮,使用完全退出当前应用。
第1步、创建自己的Application.java
/**
* 管理Activity的Application
*/
package com.figo.helloworld;
import java.util.ArrayList;
import android.app.Activity;
import android.app.Application;
/**
*
@author zhuzhifei
*
*/
public class MyApplication extends Application {
private
ArrayList<Activity> allActivities = new ArrayList<Activity>();
private
static MyApplication instance;
public
static MyApplication getInstance() {
if
(instance == null) {
instance
= new MyApplication();
}
return
instance;
}
// 添加Activity到容器中
public
void addActivity(Activity activity) {
allActivities.add(activity);
}
// 遍历所有Activity并finish
public
void exit() {
for
(Activity activity : allActivities) {
activity.finish();
}
System.exit(0);//Android的程序只是让Activity
finish()掉,而单纯的finish掉,退出并不完全
instance=null;//自身也清空
}
}
第2步、创建各个Activity
A页面AActivity.java
/**
* @author zhuzhifei[/u]
*
*/
public class AActivity extends Activity
{
private Button btnA;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.a);
btnA=(Button)findViewById(R.id.btnA);
btnA.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View
v) {
//从A跳转到B页面
Intent
intent=new Intent(AActivity.this,BActivity.class);
startActivity(intent);
}
});
//当前Activity添加到Activity数组中去
MyApplication.getInstance().addActivity(this);
}
}
B页面BActivity.java
/**
* @author zhuzhifei[/u]
*
*/
public class BActivity extends BaseActivity
{
private Button btnB;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView[/u](R.layout.b);
btnB=(Button)findViewById(R.id.btnB);
btnB.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View
v) {
//从B跳转到C页面
Intent
intent=new Intent(BActivity.this,CActivity.class);
startActivity(intent);
}
});
//当前Activity添加到Activity数组中去
MyApplication.getInstance().addActivity(this);
}
}
C页面CActivity.java
/**
* @author zhuzhifei[/u]
*
*/
public class CActivity extends Activity
{
private Button btnC;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.c);
btnC=(Button)findViewById(R.id.btnC);
//退出应用程序事件
btnC.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View
v) {
//最优做法 方法一:Activity放在数组里面统一关闭
MyApplication.getInstance().exit();
//实验证明这个方法只能关闭第一个AActivity,该方法不可取,测试手机为android
v2.21
// android.os.Process.killProcess(android.os.Process.myPid());
//这个方法也是不可以的关闭应用程序的,不知道网上那些人的文章为什么还写可以,所以啊,搞技术还得自己多动手
// ActivityManager
activityMgr= (ActivityManager)CActivity.this.getSystemService(ACTIVITY_SERVICE);
// activityMgr.restartPackage(getPackageName());
//方法二:父类activity里面实现一个广播接收器,发现需要关闭的时候即关闭自己这个Activity
//实验证明当前方式是可以退出应用程序,但是在管理应用程序-->正在运行里面还可以看见当前应用
//sendBroadcast(new
Intent("CLOSE_RECVER"));
}
});
//当前Activity添加到Activity数组中去
MyApplication.getInstance().addActivity(this);
}
}
四、另外一种思路是在baseActivity.java里面的onResume()事件里面,如果发现是需要关闭程序,然后finish当前activity,因为,如果activity都不关闭,最终关闭一个的时候,会引起连锁反应,关闭一个的时候,它后面的另外一个就会到resume。具体做法是在application设置一个是否退出的变量
@Override
protected void onResume() {
super.onResume();
Boolean isExit = (Boolean) getMyApplication().get("EXIT_APP");
if (isExit != null && isExit)
{
finish();
}
}
相关文章推荐
- Android之完美退出应用程序的方法
- Android完整退出应用程序完美解决方法
- [Activity生命周期] Android 完美退出应用程序
- android开发步步为营之15:默认让应用程序安装到手机外存sd卡上
- android开发之应用程序如何完全退出
- Android经典完美退出应用程序的方法
- 【移动开发】Android应用程序完全退出
- Android开发 之 多个Activity时的完美退出方法
- android 完美退出应用程序。
- 【Android开发】完美解决Android完全退出程序
- Android完美退出应用程序
- 【移动开发】Android应用程序完全退出
- Android中再按一次退出和完美退出整个应用程序
- 【移动开发】Android应用程序完全退出
- android 完美退出应用程序。
- android 完美退出应用程序。
- 【移动开发】Android应用程序完全退出
- Android开发全程记录(六)——完美退出APP的方法
- android 完美退出应用程序。
- Android彻底退出应用程序(转)