Android第一行代码学习笔记二----活动

本文参考Android第一行代码,大部分文字也摘自此文。

活动是一种可以包含用户界面的组件,所有活动都要在AndroidManifest,xml中注册才能生效。活动的销毁按back键或者调用finish()函数即可。主活动需要在<intent-filter>标签中加入以下声明

<action android:name="android.intent.action.Main"/>

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

一、Intent

Intent 是 Android 程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据,可用于启动活动、启动
服务、以及发送广播等场景。
Intent 的用法大致可以分为两种,显式 Intent 和隐式 Intent。
1、显示Intent
Intent有个构造函数Intent(Context packageContext, Class<?> cls),接收两个参数,第一个参数Context要求提供一个启动活动的上下文,第二个参数Class指定想要启动的目标活动。示例如下,FirstActivity基础上打开SecondActivity。

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
2、隐式Intent
隐式Intent指定一系列action和category信息,交给系统分析。示例如下:
AndroidManifest.xml配置
<activity android:name=".SecondActivity" >
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
调用代码
Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);
注意:只有<action>和category的内容同时匹配,该活动才能响应Intent。Default是一种默认的category,调用startActivity()方法时会自动将这个category添加到Intent中。
每个Intent只能指定一个action,但却能指定多个category。如果指定某种category,而配置文件中没用能够响应的活动,则程序会崩溃。
3、扩展
Intent可以启动其他程序的活动,示例如下:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
Intent.ACTION_VIEW是系统内置动作,Uri.parse()将网址字符串解析成一个Uri对象,调用setData()方法将Uri对象传递进去。
我们可以在<intent-filter>标签中再配置<data>标签,配置如下,只有intent中携带data完全一致时,当前活动才能响应。
1. android:scheme
用于指定数据的协议部分,如上例中的 http 部分。
2. android:host
用于指定数据的主机名部分,如上例中的 www.baidu.com 部分。
3. android:port
用于指定数据的端口部分,一般紧随在主机名之后。
4. android:path
用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
5. android:mimeType
4、传递数据
putExtra()方法放入数据,它接收两个参数,第一个参数是键,用于后面从 Intent中取值,第二个参数才是真正要传递的数据。getIntent()方法获取到用于启动 SecondActivity 的 Intent,然后调用getStringExtra()方法,传入相应的键值。如果传递的是整型数据,则使用getIntExtra()方法,传递的是布尔型数据,则使用 getBooleanExtra()方法,以此类推。
//启动方
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra_data", data);
startActivity(intent);
//被启动方
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.second_layout);
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity", data);
}
}
startActivityForResult()方法接收两个参数,第一个参数还是 Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。被启动的活动中还是要构建一个intent,不指定意图,放入数据即可。最后再调用setResult()。
//启动方
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
String returnedData = data.getStringExtra("data_return");
Log.d("FirstActivity", returnedData);
}
break;
default:
}
}
//被启动方
Intent intent = new Intent();
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent);
finish();
可通过重写onBackPressed()解决用户通过按下back键返回数据。
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent);
finish();
}

二、活动的生命周期

1、返回栈
在默认情况下,每当我们启动了一个新的活动入栈,销毁则出栈。系统总是显示栈顶活动。
2、活动状态
(1)运行状态
当一个活动位于返回栈的栈顶时,这时活动就处于运行状态。系统最不愿意回收的就是处于运行状态的活动,因为这会带来非常差的用户体验。
(2)暂停状态
当一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态。
(3)停止状态
当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态
(4)销毁状态
当一个活动从返回栈中移除后就变成了销毁状态。
3、活动的生存期
(1)onCreate() ——活动创建时候调用
(2)onStart() ——由不可见变为可见
(3)onResume() ——准备和用户交互调用
(4)onPause() ——准备去启动或恢复另一个活动
(5)onStop() ——活动完全不可见调用
(6)onDestory() ——活动被销毁前调用
(7)onRestart() ——活动被重启
下图摘自《Android第一行代码》。

如果活动被回收,可通过onSaveInstanceState()方法保存数据,按下back键则执行onCreate()方法。

三、活动的启动模式

启动模式一共有四种,分别是 standard、singleTop、singleTask 和 singleInstance 。
1、standard
standard 是活动默认的启动模式,该模式下系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例放入栈顶。
2、singleTop
在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。
3、singleTask
当活动的启动模式指定为 singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
4、singleInstance
singleInstance模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实例的问题。
 
<activity
android:name=".SecondActivity"
android:launchMode="singleInstance" >
   <intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.activitytest.MY_CATEGORY" />
   </intent-filter>
</activity>
























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值