Android基本之Acticity&Intent

一、理解Activity

Activity是Android程序的4大组件之一。
Activity是Android程序的表示层,程序的每一个显示屏幕就是一个Activity。

每一个Activity作为一个独立的类来实现,均继承自Activity 基类。

Activity类将显示一个由若干View 控件组成的用户界面并对事件做出响应。

大多数Activity都是全屏的,但是也可以创建半透明或者浮动的Activity。

在清单文件AndroidManifest.xml中告诉程序,我定义了一个新的Activity,你可以去调用它。

Activity是Context类的子类, Activity类的继承关系:

 

image

二、理解Activity的生命周期

如果资源不足的时候,或者在内存不足的时候,可能随时要把现有程序关闭;因此Android程序和电脑上的程序有所不同,具体到Activity,Activity的生命周期不是自身控制的,而是由Android系统控制的。

 

在Android中Activity有四种基本状态:
1、Running
位于屏幕最前端时,此时处于可见状态,和用户可交互的状态。
2、Paused
当Acitivy被另一个透明的或者非全屏的Activity覆盖时的状态叫Paused状态,虽然可见但不可交互。
3、Stop
当Activity被另外一个Activity覆盖、界面不可见时处于Stop状态。
4、Killed
Activity被系统杀死或者跟本没启动时就是Killed状态。

 

下面看一下Activity的生命周期:

 

activity_lifecycle

 
Android通过Activity栈的方式来管理Activity,正在运行的Activity 处在在栈的最顶端,它是运行状态的;


 

image

 

 

当有新Activity进入屏幕最上端时,原来的Activity就会被压入第二层,如果他的屏幕没有被完全遮盖,那么他处于Pause状态,如果他被遮盖那么他处于Stop状态。

 

当然不管你出于任何一层,都可能在系统觉得资源不足时被强行关闭,当然关闭时在栈底的程序最先被关闭。

 

譬如:当你在程序中调用 Activity.finish()方法时,结果和用户按下 BACK 键一样:他告诉 Activity Manager该Activity实例可以被“回收”。随后 Activity Manager 激活处于栈第二层的 Activity 并重新入栈,把原 Activity 压入到栈的第二层,从 Running 状态转到 Paused 状态。

 

屏幕翻转时,Android系统会把Activity先杀死(具体顺序是先暂停、后关闭再销毁),然后再启动(具体顺序是先创建,后启动再恢复), 可见是Android系统而不是程序员在控制Activity的生命周期。

 

屏幕翻转时,不销毁当前Activity的方法:首先在Mainifest.xml 的Activity 元素中加入android:configChanges="orientation|keyboardHidden"属性,并在代码中加入对onConfigurationChanged的处理;

有可能在被系统kill时,不运行onStop和onDestory这两个方法的,要注意!应在onPause的时候保存好现场。

以下摘自官方文档:

Because onPause() is the first of the three, once the activity is created, onPause() is the last method that's guaranteed to be called before the process can be killed—if the system must recover memory in an emergency, then onStop() and onDestroy() might not be called. Therefore, you should use onPause() to write crucial persistent data (such as user edits) to storage. However, you should be selective about what information must be retained during onPause(), because any blocking procedures in this method block the transition to the next activity and slow the user experience.

三、理解Intent

在一个Android应用中,Intent是对执行某个操作的一个抽象描述,Intent 负责提供组件之间相互调用的相关信息传递,实现调用者和被调用者之间的解耦。

 

 

Intent是对执行某个操作的一个抽象描述,其描述的内容包括,对执行动作Action的描述、对操作数据的描述、还有4种附加属性的描述。分别介绍如下:

Action
,对执行动作的描述,是个字符串,是对所将执行的动作的描述,在Intent类中定义了一些字符串常量作为标准动作,譬如:

public static final String ACTION_DIAL = "android.intent.action.DIAL"
public static final String ACTION_SENDTO = "android.intent.action.SENDTO";

我们还可以自定义Action,并定义相应的Activity来处理我们自定义的行为。

 

data ,是对执行动作所要操作的数据的描述,Android中采用URI来表示数据,譬如在联系人应用中,指向联系人1的URI可能为:content://contacts/1 (由content provider提供的数据类型是content) 。 结合Action和data可以基本表达出意图,

  • VIEW_ACTION content://contacts/1 — 显示标识符为”1″的联系人的详细信息
  • EDIT_ACTION content://contacts/1 — 编辑标识符为”1″的联系人的详细信息
  • VIEW_ACTION content://contacts/ — 显示所有联系人的列表
  • PICK_ACTION content://contacts/ — 显示所有联系人的列表,并且允许用户在列表中选择一个联系人,然后把这个联系人返回给父Activity。例如:电子邮件客户端可以使用这个 Intent,要求用户在联系人列表中选择一个联系人。

除了Action和data之外,还有4个属性。

 

catagory 类别,是被请求组件的额外描述信息,Intent类中也定义了一组字符串常量表示Intent不同的类别。完整的列表可以看API文档中Intent类的相应部分。

 

public static final String CATEGORY_LAUNCHER = "android.intent.category.LAUNCHER";

public static final String CATEGORY_PREFERENCE = "android.intent.category.PREFERENCE";

 

我们还可以自定义Catagory,并通过它启动那些使用了该Catagory的Activity;

 

extra 附加信息,除了data之外,还可以通过extra附加信息,extra属性使用Bundle类型进行数据传递,我们可以把Bundle当做HashMap来理解,附加数据可以通过 intent.putExtras() 和 intent.getExtras() 进行传入和读取。

 

就像这样,获取附加信息: Bundle bundle = intent.getExtras();

添加附加信息: Bundle bundle = new Bundle(); intent.putExtras(bundle);

 

component 组件,显式指定Intent的目标组件的名称。如果指定了component属性,系统会直接使用它指定的组件,而非匹配查找。

 

type 数据类型,显式指定Intent的数据类型,一般Intent的数据类型都能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型和不再进行推导。

 

Intent是一种在不同组件之间传递的请求信息,是应用程序发出的请求和意图,作为一个完整的消息传递机制,Intent不仅需要发送端,还需要接收端。

 

当指定了component属性后,就是显式的指定了目标组件,也就是接收端。

如果没有明确指定目标组件,那么Android系统会使用 Intent 里的(action,data,category)三个属性来寻找和匹配接收端。

 

应用程序组件可以使用IntentFilter来向系统说明自己可以响应和处理那些Intent请求。

组件一般通过AndroidManifest.xml文件的<Intent-Filter>描述。

<activity android:name=”.MainActivity” android:label=”@string/app_name”>

<intent-filter>

<action android:name=”android.intent.action.MAIN” />

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

</intent-filter>

</activity>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值