您的位置:首页 > 移动开发 > Android开发

android四大组件---Activity

2016-01-13 16:34 381 查看
Intent的详解:点击打开链接

Activity的启动方式参考:点击打开链接

Activity启动方式有四种,分别是:(前三个都是没有该对象时,和默认一样)
standard 默认,可以不设置,栈A--B--C--A--A--A
singleTop 栈顶唯一,栈A--B--C--A,多用于聊天页面
singleTask 栈A--B--C--之后在开启A,则栈里只有A,其余清空,多用回主页
singleInstance   整个系统唯一,有独立栈,且永远在栈顶

可以根据实际的需求为Activity设置对应的启动模式,从而可以避免创建大量重复的Activity等问题。

设置Activity的启动模式,只需要在AndroidManifest.xml里对应的<activity>标签设置android:launchMode属性,例如:

[html] view
plaincopy

<activity  

    android:name=".A1"  

    android:launchMode="standard" />  

下面是这四种模式的作用:

standard
默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。

例如:
若我有一个Activity名为A1, 上面有一个按钮可跳转到A1。那么如果我点击按钮,便会新启一个Activity A1叠在刚才的A1之上,再点击,又会再新启一个在它之上……
点back键会依照栈顺序依次退出。

singleTop
可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。(不会OnCreate(),直接OnNewIntent())

例如:
若我有两个Activity名为B1,B2,两个Activity内容功能完全相同,都有两个按钮可以跳到B1或者B2,唯一不同的是B1为standard,B2为singleTop。
若我意图打开的顺序为B1->B2->B2,则实际打开的顺序为B1->B2(后一次意图打开B2,实际只调用了前一个的onNewIntent方法)
若我意图打开的顺序为B1->B2->B1->B2,则实际打开的顺序与意图的一致,为B1->B2->B1->B2。

singleTask
只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。

例如:
若我的应用程序中有三个Activity,C1,C2,C3,三个Activity可互相启动,其中C2为singleTask模式,那么,无论我在这个程序中如何点击启动,如:C1->C2->C3->C2->C3->C1-C2,C1,C3可能存在多个实例,但是C2只会存在一个,并且这三个Activity都在同一个task里面。
但是C1->C2->C3->C2->C3->C1-C2,这样的操作过程实际应该是如下这样的,因为singleTask会把task中在其之上的其它Activity destory掉。
操作:C1->C2          C1->C2->C3          C1->C2->C3->C2            C1->C2->C3->C2->C3->C1             C1->C2->C3->C2->C3->C1-C2
实际:C1->C2          C1->C2->C3          C1->C2                              C1->C2->C3->C1                               C1->C2

若是别的应用程序打开C2,则会新启一个task。
如别的应用Other中有一个activity,taskId为200,从它打开C2,则C2的taskIdI不会为200,例如C2的taskId为201,那么再从C2打开C1、C3,则C2、C3的taskId仍为201。
注意:如果此时俠点击home,然后再打开Other,发现这时显示的肯定会是Other应用中的内容,而不会是我们应用中的C1 C2 C3中的其中一个。

singleInstance
只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在,之后用的时候直接调用,不用重新创建

例如:
程序有三个ActivityD1,D2,D3,三个Activity可互相启动,其中D2为singleInstance模式。那么程序从D1开始运行,假设D1的taskId为200,那么从D1启动D2时,D2会新启动一个task,即D2与D1不在一个task中运行。假设D2的taskId为201,再从D2启动D3时,D3的taskId为200,也就是说它被压到了D1启动的任务栈中。

若是在别的应用程序打开D2,假设Other的taskId为200,打开D2,D2会新建一个task运行,假设它的taskId为201,那么如果这时再从D2启动D1或者D3,则又会再创建一个task,因此,若操作步骤为other->D2->D1,这过程就涉及到了3个task了。

以下参考《第一行代码》

管理Acitivity来知晓当前是在哪一个活动

 这个技巧将教会你,如何根据程序当前的界面就能判断出是哪个Activity,我自己写的代码怎么会不知道这是哪一个活动呢?到企业之后,更有可能的是接手一份别人写的代码,因为你刚进公司就正好有一个新项目启动的概率并不高。阅读别人的代码时有一个很头疼的问题,就是你些非常简单的东西,但是你半天找不到这个界面对应的活动是哪个。

  首先需要新建BaseActivity继承于Activity,然后在 BaseActivity 中重写 onCreate()方法,如下所示:

public class BasicActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
Log.e("BasicActivity",getClass().getSimpleName());
}
}


  我们在 onCreate()方法中获取了当前实例的类名,并通过 Log 打印了出来。

  接下来我们需要让 BaseActivity 成为 ActivityTest 项目中所有活动的父类。修改之后的activity继承于BaseActivity,让它们不再继承自 Activity,而是继承自 BaseActivity。虽然项目中的活动不再直接继承自
Activity 了,但是它们仍然完全继承了 Activity 中的所有特性。
  现在每当我们进入到一个活动的界面,该活动的类名就会被打印出来,这样我们就可以时时刻刻知晓当前界面对应的是哪一个活动了。

全局获取 Context的技巧
     有很多地方都需要用到 Context,弹出
Toast的时候需要、启动活动的时候需要、发送广播的时候需要、操作数据库的时候需要、使用通知的时候需要等等等等。或许目前你还没有为得不到
Context 而发愁过,因为我们很多的操作都是在活动中进行的,而活动本身就是一个
Context对象。但是,当应用程序的架构逐渐开始复杂起来的时候,
很多的逻辑代码都将脱离 Activity类,但此时你又恰恰需要使用
Context,也许这个时候你就
会感到有些伤脑筋了。

     Android 提供了一个 Application类,每当应用程序启动的时候,系统就会自动将这个类进行初始化。而我们可以定制一个自己的Application类,以便于管理程序内一些全局的状态信息,比如说全局
Context。定制一个自己 Application其实并不复杂,首先我们需要创建一个
MyApplication类继承自 Application,代码如下所示:

public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate() {
context = getApplicationContext();
}
public static Context getContext() {
return context;
}
}


可以看到,MyApplication中的代码非常简单。这里我们重写了父类的
onCreate()方法,并通过调用 getApplicationContext()方法得到了一个应用程序级别的
Context,然后又提供了一个静态的 getContext()方法,在这里将刚才获取到的
Context 进行返回。接下来我们需要告知系统,当程序启动的时候应该初始化MyApplication类,而不是默认的
Application类。这一步也很简单,在 AndroidManifest.xml文件的<application>标签下进
行指定就可以了,代码如下所示:

<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.networktest"
android:versionCode="1"
android:versionName="1.0" >
……
<application
android:name="com.example.networktest.MyApplication"
…… >
……
</application>
</manifest>


这样我们就已经实现了一种全局获取Context的机制,之后不管你想在项目的任何地方使用
Context,只需要调用一下 MyApplication.getContext()就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: