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(); } }