Android四大组件之:Activity

来源:互联网 发布:magnet协议软件下载 编辑:程序博客网 时间:2024/06/10 11:03


一个用户交互界面对应一个activity,activity Context的子类,同时实现了window.callbackkeyevent.callback, 

可以处理与窗体用户交互的事件

生命周期

#Activity生命周期

###void onCreate()

* Activity已经被创建完毕

###void onStart()

* Activity已经显示在屏幕,但没有得到焦点

###void onResume()

* Activity得到焦点,可以与用户交互

###void onPause()

* Activity失去焦点,无法再与用户交互,但依然可见

###void onStop()

* Activity不可见,进入后台

###void onDestroy()

* Activity被销毁

###void onRestart()

* Activity从不可见变成可见时会执行此方法


###完整生命周期(entire lifetime

onCreate-->onStart-->onResume-->onPause-->onStop-->onDestory

###可视生命周期(visible lifetime

onStart-->onResume-->onPause-->onStop

###前台生命周期(foreground lifetime

onResume-->onPause

 

横竖屏切换时候Activity的生命周期

 

1、不设置Activityandroid:configChanges时,切屏会重新调用各个生命周期

默认首先销毁当前activity,然后重新加载

 

2、设置Activityandroid:configChanges="orientation|keyboardHidden|screenSize"时,切屏不会重新调用各个生命周期,

只会执行onConfigurationChanged方法。

 

3、游戏开发中屏幕的朝向都是写死的

android:screenOrientation="landscape"

android:screenOrientation="portrait"


任务栈和启动模式

1.一个应用程序一般都是由多个activity组成的。

2.任务栈(task stack)(别名back stack后退栈) 记录存放用户开启的activity的。

3.一个应用程序一被开启系统就给他分配一个任务栈,当所有的activity都退出的时候,任务栈就清空了。

4.任务栈的id是一个integer的数据类型 自增长的。

5.android操作系统里面会存在多个任务栈,一个应用程序一个任务栈。

6.桌面应用和一般的应用程序是一样的,任务栈的行为也是一样。

7.默认情况下, 关闭掉一个应用程序,清空了这个应用程序的任务栈。应用程序的进程还会保留。

 

#Activity的四种启动模式

>每个应用会有一个Activity任务栈,存放已启动的Activity

* standard 默认标准的启动模式, 每次startActivity都是创建一个新的activity的实例。

 

* singleTop 单一顶部模式 

如果任务栈的栈顶存在这个要开启的activity,不会重新的创建activity,而是复用已经存在的activity。保证栈顶如果存在,不会重复创建。

应用场景:浏览器的书签

 

* singeTask 单一任务栈,在当前任务栈里面只能有一个实例存在

当开启activity的时候,就去检查在任务栈里面是否有实例已经存在,如果有实例存在就复用这个已经存在的activity,并且把这个activity上面的所有的别的activity都清空,

复用这个已经存在的activity。保证整个任务栈里面只有一个实例存在

应用场景:浏览器的activity,整个任务栈只有一个实例,节约内存和cpu的目的

如果一个activity的创建需要占用大量的系统资源(cpu,内存)一般配置这个activitysingletask的启动模式。webkit内核 c代码

 

* singleInstance单态 单例模式

    单一实例,整个手机操作系统里面只有一个实例存在。不同的应用去打开这个activity公用的同一个activity。他会运行在自己单独,独立的任务栈里面,并且任务栈里面只有他一个实例存在。

应用场景: 电话拨打界面

Activity的跳转

>Activity的跳转需要创建Intent对象,通过设置intent对象的参数指定要跳转Activity

 

###显式意图

>通过设置Activity的包名和类名实现跳转,称为显式意图

 

跳转至同一项目下的另一个Activity,直接指定该Activity的字节码即可

Intent intent = new Intent();

intent.setClass(this, SecondActivity.class);tartActivity(intent);

 

跳转至其他应用中的Activity,需要指定该应用的包名和该Activity的类名

Intent intent = new Intent();

//启动系统自带的拨号器应用

intent.setClassName("com.android.dialer", "com.android.dialer.DialtactsActivity");

startActivity(intent);

 

###隐式意图

>通过指定动作实现跳转,称为隐式意图

 

隐式意图跳转至指定Activity

Intent intent = new Intent();

//启动系统自带的拨号器应用

    intent.setAction(Intent.ACTION_DIAL);

    startActivity(intent);

 

要让一个Activity可以被隐式启动,需要在清单文件的activity节点中

设置intent-filter子节点

   <intent-filter >

            <action android:name="com.itheima.second"/>

            <data android:scheme="asd" android:mimeType="aa/bb"/>

            <category android:name="android.intent.category.DEFAULT"/>

        </intent-filter>

 

* action 指定动作(可以自定义,可以使用系统自带的)

* data   指定数据(操作什么内容)

* category 类别 (默认类别,机顶盒,车载电脑)

隐式意图启动Activity,需要为intent设置以上三个属性,且值必须与该Activity在清单文件中对三个属性的定义匹配

* intent-filter节点及其子节点都可以同时定义多个,隐式启动时只需与任意一个匹配即可

 

#####获取通过setData传递的数据

//获取启动此Activityintent对象

Intent intent = getIntent();

Uri uri = intent.getData();

 

###显式意图和隐式意图的应用场景

显式意图用于启动同一应用中的Activity

隐式意图用于启动不同应用中的Activity

如果系统中存在多个Activityintent-filter同时与你的intent匹配,那么系统会显示一个对话框,列出所有匹配的Activity,由用户选择启动哪一个

 

#Activity跳转时的数据传递

 

* Activity通过Intent启动时,可以通过Intent对象携带数据到目标Activity

Intent intent = new Intent(this, SecondActivity.class);

     intent.putExtra("maleName", maleName);

     intent.putExtra("femaleName", femaleName);

     startActivity(intent);

 

在目标Activity中取出数据

Intent intent = getIntent();

String maleName = intent.getStringExtra("maleName");

String femaleName = intent.getStringExtra("femaleName");


Activity间数据传递

两个Activity之间怎么传递数据?

基本数据类型可以通过.Intent 传递数据  

extras.putDouble(key, value)

intent.putExtra(name, value)  

// 通过intent putExtra 方法 基本数据类型都传递 

Bundle bundle = new Bundle();

bundle.putShort(key, value);

intent.putExtras(bundle);

intent.putExtras(bundle)

 

获取到激活他的getIntent();

Intent intent = getIntent();

Bundle bundle = intent.getExtras();

Bundle 类似map的集合 

intent.getStringExtra("key","value");

intent.getBooleanExtra("key","value")

 

Application 全局里面存放对象,自己去实现自己的application的这个类,基础系统的application , 每个activity都可以取到 

 

让对象实现 implements  Serializable 接口把对象存放到文件上.  

让类实现Serializable 接口,然后可以通过 ObjectOutputStream //对象输出流  

File file = new File("c:\\1.obj");

FileOutputStream fos  = new FileOutputStream(file);

ObjectOutputStream oos = new ObjectOutputStream(fos);

Student stu = new Student();

stu.setId("10001");

stu.setName("zs");

oos.writeObject(stu);

FileInputStream fis = new FileInputStream(file);

ObjectInputStream ois = new ObjectInputStream(fis);

 Student stu1 = (Student) ois.readObject();

System.out.println(stu1.getName());

 

Parcelable 和 Serializable 

Parcelable 把对象序列化到android操作系统 的一块公用的内存空间 

文件/网络 

//传递数据的引用 

intent.setData(Uri) 

Uri.fromFile();  //大图片的传递

contentResolver.getInputStream(uri);


Activity退出方式

如何退出Activity?如何安全退出已调用多个ActivityApplication

对于单一Activity的应用来说,退出很简单,直接finish()即可。当然,也可以用killProcess()System.exit()这样的方法。但是,对于多Activity的应用来说,

在打开多个Activity后,如果想在最后打开的Activity直接退出,上边的方法都是没有用的,因为上边的方法都是结束一个Activity而已。

 

那么,有没有办法直接退出整个应用呢?

2.1之前,可以使用ActivityManagerrestartPackage方法。它可以直接结束整个应用。在使用时需要权限android.permission.RESTART_PACKAGES。注意不要被它的名字迷惑。

可是,在2.2,这个方法失效了。在2.2添加了一个新的方法,killBackgroundProcesses(),需要权限 android.permission.KILL_BACKGROUND_PROCESSES。可惜的是,它和2.2

restartPackage一样,根本起不到应有的效果。

 

另外还有一个方法,就是系统自带的应用程序管理里,强制结束程序的方法,forceStopPackage()。它需要权限android.permission.FORCE_STOP_PACKAGES。并且需要添加

android:sharedUserId="android.uid.system"属性同样可惜的是,该方法是非公开的,他只能运行在系统进程,第三方程序无法调用。因为需要在Android.mk中添加LOCAL_CERTIFICATE := platform

Android.mk是用于在Android源码下编译程序用的。从以上可以看出,在2.2,没有办法直接结束一个应用,而只能用自己的办法间接办到。

 

现提供几个方法,供参考:

 

1、抛异常强制退出:

该方法通过抛异常,使程序Force Close

验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。

 

2、记录打开的Activity

每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。

 

3、发送特定广播:

在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。

 

4、递归退出

在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。但是这样做同样不完美。你会发现,如果自己的应用程序对每一个Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。

但至少,我们的目的达到了,而且没有影响用户使用。为了编程方便,最好定义一个Activity基类,处理这些共通问题。 






0 0
原创粉丝点击