您的位置:首页 > 其它

四大组件复习(一)

2016-12-06 17:01 162 查看
今天回来复习一下四大组件,四大组件包括Activity(活动)、Broadcast(广播)、ContentProvider(内容提供器)、Service(服务),这篇就复习一下Activity

下面复习的内容包括Activity的生命周期、两种启动方式、四种启动模式、数据传输

一、生命周期

Activity的生命周期可以用下面这张图来看(图是在网上找的,官方文档也有)



可以看到,其生命周期包括onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()、onRestart()七个方法,其中在onCreate()创建的方法中我们经常创建项目的时候会自动创建,是因为在这个方法中我们需要 去加载布局,所以我们可以经常看到下面这样的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//加载布局
Log.e("Activity生命周期","onCreate");
}
下面就通过Log日志打印来看一下生命周期中方法的调用的顺序:(打开应用,关闭应用)

12-06 17:13:12.544 15069-15069/com.example.administrator.activitytest E/Activity生命周期: onCreate

12-06 17:13:12.545 15069-15069/com.example.administrator.activitytest E/Activity生命周期: onStart

12-06 17:13:12.548 15069-15069/com.example.administrator.activitytest E/Activity生命周期: onResume

12-06 17:13:17.517 15069-15069/com.example.administrator.activitytest E/Activity生命周期: onPause

12-06 17:13:17.769 15069-15069/com.example.administrator.activitytest E/Activity生命周期: onStop

12-06 17:13:17.769 15069-15069/com.example.administrator.activitytest E/Activity生命周期: onDestroy

当我们启动应用的时候会先依次调用前面三个方法,点击关闭应用时候会调用后面三个方法

如果当我们启动应用之后,我们锁屏关闭屏幕,或者最小化应用,让他在后台进行的时候,就只会调用至onStop()方法,而不会之前调用onDestroy()方法,如果手机系统内存不足时,就会调用被强制关闭清理掉

12-06 17:16:02.870 15069-15069/com.example.administrator.activitytest E/Activity生命周期: onPause

12-06 17:16:02.901 15069-15069/com.example.administrator.activitytest E/Activity生命周期: onStop

另外,当我们手机由竖屏切换至横屏的时候,Activity是会被销毁之后重新创建的,所以我们一般在项目中,一般会在onPause()方法前保存数据,防止数据在屏幕切换的时候出现丢失

二、两种启动方式

Activity启动方式分为显示启动和隐式启动两种

(1)显示方式

首先我们要注意的是,每当我们创建一个新的Activity时,我们应该总是首先去AndroidManifest.xml文件中注册它,下面是非主活动的注册声明:

<activity android:name=”.SecondActivity”>
</activity>


使用以下语句从FirstActivity切换到SecondActivity中去:

Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
当然我们还可以借助ComponentName类,如下

Intent intent = new Intent();
ComponentName componentName = new ComponentName(MainActivity.this,SecondActivity.class);
intent.setComponent(componentName);
startActivity(intent);


(2)  隐式方式
使用隐式的Intent方法来切换Activity我们需要在注册声明新的Activity时,加入以下的语句:

<activity android:name=”.SecondActivity”>
<intent-filter>
<actionandroid:name=” com.example.activitytest.ACTION_START”/>
<categoryandroid:name=”android:intent.category.DEFAULT”/>
</intent-filter>
</activity>


然后就可以用以下语句进行切换

Intent intent = new Intent(“com.example.activitytest.ACTION_START”);
startActivity(intent);


应该注意的是每个Intent只能指定一个action,但却可以指定多个category

三、四种启动模式

1、Activity的四种启动模式:standard、singleTop、singleTask、singleInstance
设置选择方式:在AndroidManifest.xml文件中通过给<activity>标签的android:launchMode属性来选择启动模式。
(1)  Standard
分析:这种模式是默认的模式,每当我们启动一个新的Activity时,它都会创建该活动的一个新的实例,不会在意所创建的Activity是否已经创建过(存在返回栈中),按返回键时需要一次一次的关闭之前所创建过的Activity的实例。
(2)  singleTop
分析:这种模式在启动Activity时如果发现返回栈的栈顶已经是该Activity,则认为可以直接使用它,而不会创建新的Activity的实例。(但是,需要注意的是,如果我们需要创建的Activity已经存在,但是并没有在栈顶,这时候,它还是会创建该Activity的实例)
(3)  singleTask
分析:这种模式它在我们想要创建新的Activity的实例的时候,会先去返回栈中检查我们即将要创建的Activity是否已经创建过(也就是说每个Activity只能存在一个实例,不能重复)。
(4)  singleInstance
分析:当我们需要将程序中的一个Activity共享给别的应用的时候,我们就必须采用这种模式,这种模式的活动会启用一个新的返回栈来管理这个活动

四、数据传送

Activity之间避免不了数据之间的交互,下面就复习一下Activity之间的数据交互

(1)直接使用Intent传输

Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("string","这里是第一个Activity,发送数据到第二个Activity");
startActivity(intent);
上面是发送方的,接收方的也很简单

Intent intent = getIntent();
if(intent!=null){
String string = intent.getStringExtra("string");
}


(2)利用Intent传输的时候也可以借助Bundle这个类

Intent intent = new Intent(MainActivity.this,SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("string","shenmegui");
intent.putExtras(bundle);
startActivity(intent);
接收跟上面是一样的

上面的方法只适用于传输少量的数据,对于数据量比较大的时候,就不太合适

(3)利用Serializable接口实现传递对象

新建一个Shop封装类继承Serializable接口,将要传输的数据放在封装成方法,通过获取对象进行获取对应数据

package com.example.administrator.activitytest1;

import java.io.Serializable;

/**
* Created by Administrator on 2016/12/7 0007.
*/
public class Shop implements Serializable{

private String name;
private int account;

public Shop(String name,int account){
this.name = name;
this.account = account;
}

public String getString(){
return "name:"+name+",account:"+account;
}
}
还是利用Bundle传递对象

Intent intent = new Intent(MainActivity.this,SecondActivity.class);
Bundle bundle = new Bundle();
Shop shop = new Shop("篮球",100);
bundle.putSerializable("Shop",shop);
intent.putExtras(bundle);
startActivity(intent);
获取
Intent intent = getIntent();
if(intent!=null){
Shop shop = (Shop) intent.getSerializableExtra("Shop");
}
上面的Shop类中的两个对象,我们可以分别写get和set方法,一遍可以逐个获取,更加灵活,这里就只是放在一起了,这样借助中间类就可以实现传输大量的数据

(4)再举一个传递图片的例子

Intent intent = new Intent(MainActivity.this,SecondActivity.class);
Bundle bundle = new Bundle();
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
bundle.putParcelable("图片",bitmap);
intent.putExtras(bundle);
startActivity(intent);
Intent intent = getIntent();
if(intent!=null){
Bitmap bitmap = (Bitmap) intent.getParcelableExtra("图片");
imageView.setImageBitmap(bitmap);
}
注意如果传输数据量过大,可能会抛出TransactionTooLargeException这个异常
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: