android四大组件之Activity(二)

上一章讲了关于activity的生命周期,在一本书上看到了android进程的分类就先copy到这个地方。

android系统进程的分类

android系统的进程大致可以分为五类:前台进程、可见进程、服务进程、后台进程、空进程

1、前台进程:即当前正在前台运行的进程,说明用户当前正在与通过该进程与系统进行交互,所以该进程为最重要的进程,除非系统的内容已经到不堪重负 的情   况,否则系统是不会将改进程终止的。
2、可见进程:一般还是显示在屏幕中,但是用户并没有直接与之进行交互,该进程对用户来说同样是非常重要的进程,除非为了保证前台进程的正常运行, 否则   Android系统一般是不会将该进程终止的。类似通知的对话框Toast
3、服务进程:便是拥有Service进程,该进程一般是在后台为用户服务的。一般情况下,Android系统是不会将其中断的,除非系统的内容以及达到崩溃的边 缘,必   须通过释放该进程才能保证前台进程的正常运行时,才可能将其终止。
4、后台进程:一般对用户的作用不大,缺少该进程并不会影响用户对系统的体验。所以如果系统需要终止某个进程才能保证系统正常运行,那么会有非常大 的几率   将该进程终止。

5、空进程:对用户没有任何作用的进程,该进程一般是为缓存机制服务的,当系统需要终止某个进程保证系统的正常服务时,会首先将该进程终

activity之间的数据传递
之前在系统提供的常见的activity的时候也接触到,主要是往intent里面绑定数据,最先想到的就是Bundle类。通过intent.putExtras(bundle)将bundle绑定到intent上。
那数据是怎么样挂载bundle上呢?主要就是通过bundle类提供的方法,putString( )等等函数是完全可以实现的。这个只是对于发送端而言,对于接收端呢?

首先通过getIntent( )函数获取intent对象,然后调用intent的getExtralxxx函数获取对应的值,实际上有种键来找到对应的值的感觉。
1、从mainactivity------>my_activity

        // 下面这三个函数直接调用是不会生效的
        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);
不使用setclass函数可以直接在new Intent的时候就指定class
 
  
 Intent intent = new Intent(MainActivity.this,my_activity.class);
// intent.setClass(MainActivity.this,my_activity.class);

在my_activity的oncreate函数里面进行这样的设置。

        Intent intent = getIntent();
        String result = intent.getStringExtra("key");
        Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();
传递多个数据页可以直接在main里面使用bunlde多绑定一些数据,在my_activity里面直接使用
intent.getStringExtral来继续获取数据,不一定一定需要使用到bundle

下面这幅图还是很能说明:

2、从my_activity------>mainactivity

实际上是类似的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的函数来实现。

在mainactivit.java文件中。
    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来关闭当前窗口。

继续在mainactivity.java里重写onActivityResult函数来响应setResult函数。
    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 problem

5.完全退出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)就能关闭程序,其实大多情况下

该应用还在任务里运行着,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值