四大组件复习(一)
2016-12-06 17:01
162 查看
今天回来复习一下四大组件,四大组件包括Activity(活动)、Broadcast(广播)、ContentProvider(内容提供器)、Service(服务),这篇就复习一下Activity
下面复习的内容包括Activity的生命周期、两种启动方式、四种启动模式、数据传输
一、生命周期
Activity的生命周期可以用下面这张图来看(图是在网上找的,官方文档也有)
可以看到,其生命周期包括onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()、onRestart()七个方法,其中在onCreate()创建的方法中我们经常创建项目的时候会自动创建,是因为在这个方法中我们需要 去加载布局,所以我们可以经常看到下面这样的代码:
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文件中注册它,下面是非主活动的注册声明:
使用以下语句从FirstActivity切换到SecondActivity中去:
(2) 隐式方式
使用隐式的Intent方法来切换Activity我们需要在注册声明新的Activity时,加入以下的语句:
然后就可以用以下语句进行切换
应该注意的是每个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传输
(2)利用Intent传输的时候也可以借助Bundle这个类
上面的方法只适用于传输少量的数据,对于数据量比较大的时候,就不太合适
(3)利用Serializable接口实现传递对象
新建一个Shop封装类继承Serializable接口,将要传输的数据放在封装成方法,通过获取对象进行获取对应数据
(4)再举一个传递图片的例子
下面复习的内容包括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这个异常
相关文章推荐
- #学志#银行家算法
- C++11标准 STL正则表达式 验证电子邮件地址
- am335x watchdog 设备出错
- C可变参数函数 实现
- Smooks:xml-to-java
- 解决Ionic的ion-slide-box 2条数据渲染问题
- dictonary按键值进行排序
- [置顶] java微信开发-之如何获取openid 和用户信息
- Intent的使用:显示调用 Activity的跳转
- C++正则表达式的使用
- @Html内的函数解析。(一)
- 第一章 开发简单的java应用程序
- android系统联系人查询流程
- [转载]正高级职称与副高级职称的区别是什么
- C/C++无限关机(提权例子)
- “条件语句”和“循环语句”
- MTK路由器rt5350 mt7620 7688等串口控制台不能修改默认波特率问题
- ubuntu14.04安装OpenJDK1.8
- 浅谈 &0xFF操作
- iOS常用宏 定义