Menu学习,和如何实现一步关闭所有的activity退出应用程序

1首先介绍如何写menu,若想在activity里添加menu按钮时,在activity里覆写下面2个方法:

public boolean onCreateOptionsMenu(Menu menu)和public boolean onOptionsItemSelected(MenuItem item),并且在onCreateOptionsMenu加载menu的xml界面。xml界面在res文件下menu文件夹里创建一个xml文件添加menu的选项,也可以为选项添加图标,如下文件。然后在onOptionsItemSelected实现点击相应条目后的操作。

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.demo.MainActivity" >

    <item
        android:id="@+id/close_all"
        android:title="完全退出"
       />
	<item
        android:id="@+id/close_this"
        android:title="完全当前"
       />
</menu>

 2、当应用程序开启很多activity时候,想要退出就必须按很多次返回键,我们可以在menu实现一步退出:

退出有三种方式:

 

经过测试:1虽然能关闭程序但不会清空任务栈,也就是退出失败。2也无法实现程序完全退出。3需要权限,多用于安全管家之类的软件,它只能关闭其他的应用程序,不能关闭自己的应用程序,注意还需要权限

  3、为了实现程序的全部退出:

(1)我们可以定义个类App,继承Application,它是应用程序的实例,只要程序存活就存在,在里面定义一个用于存入所有activity的集合成员变量,并且覆写该类的oncreat方法(只在应用程序第一次运行时调用)在里面实例化这个成员变量。

(2)APP类创建好后,打开清单文件,点击application,然后点击name后面的browse预览,就会加载出刚刚写app类,点击选中点击ok就会将App这个实例配置到清单文件的application内:

 

(3)然后在每个activity的oncreat方法里,把该activity添加到App的集合里 ,在Ondestroy()里从集合里删除该activity。最后在点击menu里的“完全退出”的时候,就finish掉所有的activity即可。

  4、demo如下:实现了上面所讲到的:

1、activity1和activity2的xml文件都是一个textview和button一个是显示第几个activity,一个是点击激活另一个activity的,因此这里就不给出了。

2、App类:

public class App extends Application {
	//记录所有的activity的集合
	 ArrayList<Activity>activities;
	//private
	//创建整个应用程序的全局实例,
	//在整个程序第一次创建时候执行
	@Override
	public void onCreate() {
		activities=new ArrayList<Activity>();
		super.onCreate();
	}
	
}

 3  MainActivity的java文件:,在Activity2里也是在oncreat方法里吧activity加到集合,然后ondestroy里移除activity,因此这里就只给出MainActivity文件

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        App app=(App) getApplication();
        app.activities.add(this);
        setContentView(R.layout.activity_main);
    }
    
    public void start2(View v)
    {
    	Intent intent=new Intent();
    	intent.setClassName("com.example.demo", "com.example.demo.Activity2");
    	startActivity(intent);
    }

	@Override  //实现value的界面加载
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater=new MenuInflater(this);
		inflater.inflate(R.menu.main, menu);
		return super.onCreateOptionsMenu(menu);
	}

	@Override//实现menue的点击事件:当前退出,和完全退出
	public boolean onOptionsItemSelected(MenuItem item) {
		
		switch (item.getItemId()) {
		case R.id.close_all:
			App app=(App) getApplication();			
			for(Activity act:app.activities)
				act.finish();
//   打印结果证明:activity被finish掉后,app.activities里的activity对象并没被移除,它finish是操作任务栈的activity,
//			因此可以用高级for循环
			System.out.println(app.activities.size());
			break;

		case R.id.close_this:
			finish();
			break;
		default:
			break;
		}
		
		return super.onOptionsItemSelected(item);
	}

	@Override//当按返回键等时候就会销毁该activity因此也要移除集合里的activity
	protected void onDestroy() {
		App app=(App) getApplication();
		app.activities.remove(this);
		super.onDestroy();
	}        
}

  

posted @ 2015-08-26 15:47  Lammy  阅读(627)  评论(0编辑  收藏  举报