上一章讲了关于activity的生命周期,在一本书上看到了android进程的分类就先copy到这个地方。
android系统进程的分类
android系统的进程大致可以分为五类:前台进程、可见进程、服务进程、后台进程、空进程
1、前台进程:即当前正在前台运行的进程,说明用户当前正在与通过该进程与系统进行交互,所以该进程为最重要的进程,除非系统的内容已经到不堪重负 的情 况,否则系统是不会将改进程终止的。2、可见进程:一般还是显示在屏幕中,但是用户并没有直接与之进行交互,该进程对用户来说同样是非常重要的进程,除非为了保证前台进程的正常运行, 否则 Android系统一般是不会将该进程终止的。类似通知的对话框Toast
3、服务进程:便是拥有Service进程,该进程一般是在后台为用户服务的。一般情况下,Android系统是不会将其中断的,除非系统的内容以及达到崩溃的边 缘,必 须通过释放该进程才能保证前台进程的正常运行时,才可能将其终止。
4、后台进程:一般对用户的作用不大,缺少该进程并不会影响用户对系统的体验。所以如果系统需要终止某个进程才能保证系统正常运行,那么会有非常大 的几率 将该进程终止。
// 下面这三个函数直接调用是不会生效的
Bundle bundle = new Bundle();
bundle.putString("key","this is my value");
Intent intent = new Intent();
intent.setClass(MainActivity.this,my_activity.class);
intent.putExtras(bundle);
//intent.putExtra("key","this is my world");
startActivity(intent);
Intent intent = new Intent(MainActivity.this,my_activity.class);
// intent.setClass(MainActivity.this,my_activity.class);
Intent intent = getIntent();
String result = intent.getStringExtra("key");
Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();

实际上是类似的my_activity里面设置如下:
Intent intent = new Intent();
intent.putExtra("my_activity","this is form my_activity");
intent.setClass(this,MainActivity.class);
startActivity(intent);
继续到mainactivity里面在oncreat函数里面完全可以开始就显示。
Intent intent = getIntent();
Toast.makeText(getApplicationContext(), intent.getStringExtra("my_activity"), Toast.LENGTH_SHORT).show();
但是一般都不会这样做,这里会用到的是一个关于Result的函数来实现。
public void close_button(View view){
// 下面这三个函数直接调用是不会生效的
Bundle bundle = new Bundle();
bundle.putString("key","this is my value");
Intent intent = new Intent();
intent.setClass(MainActivity.this,my_activity.class);
intent.putExtras(bundle);
//intent.putExtra("key","this is my world");
startActivityForResult(intent,3);
// startActivity(intent);
return;
}
使用startActivityForResult来指定返回值的请求吗,该请求吗可以用户自定义,然后在my_activity使用setResult来指定返回值的请求码和里面绑定的数据
Intent intent = new Intent();
intent.putExtra("my_activity","this is form my_activity");
intent.setClass(this,MainActivity.class);// 可要可不要都可以
setResult(3,intent);
使用finish来关闭当前窗口。
protected void onActivityResult(int requsetcode, int resultcode, Intent data){ super.onActivityResult(requsetcode,resultcode,data); switch (resultcode){ case 3: Toast.makeText(getApplicationContext(), data.getStringExtra("my_activity"), Toast.LENGTH_SHORT).show(); break; } }
多个Activity间的交互(后一个传回给前一个)
代码示例:
效果图:
代码下载:ActivityTest2.zip
但是这个例子需要涉及到BaseAdapater还有就是GridView控件、ImgView控件,对于初学还是有点难度。
3.知晓当前是哪个Activity
但是也不一定一定需要继承BaseActivity类,可以直接使用System.out.println(getClass().getSimpleName())为类的名称
4.随时关闭所有Activity
有时我们可能会打开了很多个Activity,突然来个这样的需求,在某个页面可以关掉 所有的Activity并退出程序!好吧,下面提供一个关闭所有Activity的方法, 就是用一个list集合来存储所有Activity!
具体代码如下:
这里科普一下static变量和static方法:
static 修饰的是 静态变量,它的优点是 使用很方便,在不同的类和包中都可以使用,在虚拟机中单独占用内存。
static方法和非static方法之间的区别:
1.调用非静态方法,方法必须声明为public
1
2
3
4
5
6
7
public class Test
{
public String getB()
{
return "B";
}
}
调用方法:
1
2
3
1.Test test=new Test();
test.getB();
2.new Test().getB();
2.调用静态方法,方法必须声明为public
1
2
3
4
5
6
7
public class Test
{
public static String getB()
{
return "B";
}
}
调用方法:
1
Test.getB()
public class ActivityCollector { public static LinkedList<Activity> activities = new LinkedList<Activity>(); public static void addActivity(Activity activity) { activities.add(activity); } public static void removeActivity(Activity activity) { activities.remove(activity); } public static void finishAll() { for(Activity activity:activities) { if(!activity.isFinishing()) { activity.finish(); } } } }所以直接在mainactivity和my_activity里面使用类名.方法的形式来调用是完全没有问题的。ActivityCollector.addActivity(this); no problem5.完全退出App的方法
上面说的是关闭所有Activity的,但是有些时候我们可能想杀死整个App,连后台任务都杀死 杀得一干二净的话,可以使用搭配着下述代码使用:
实现代码:
/** * 退出应用程序 */ public void AppExit(Context context) { try { ActivityCollector.finishAll(); ActivityManager activityMgr = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); activityMgr.killBackgroundProcesses(context.getPackageName()); System.exit(0); } catch (Exception ignored) {} }实际上调用该函数需要传入的就是context,这里我只是找到了一个获取getBaseContext() 返回由构造函数指定或setBaseContext()设置的上下文
调用方法如下:AppExit(getBaseContext());
那finish和System.exit(0)有什么区别呢!实际上从上面一个函数killBackgroundProcess函数里面就能够感受出来,实际上finish是
没有实现kill后台线程的。
他只是由前台进程推动到了后台进程,下面这个说法还更加专业
finish是Activity的类,仅仅针对Activity,当调用finish()时,只是将活动推向后台,并没有立即释放内存,活动的
资源并没有被清理;当调用System.exit(0)时,杀死了整个进程,
这时候活动所占的资源也会被释放。
在开发android应用时,常常通过按返回键(即keyCode == KeyEvent.KEYCODE_BACK)就能关闭程序,其实大多情况下
该应用还在任务里运行着,