【Android】Activity

Activity简介

Activity通常展现为一个可视化的用户界面,是Android程序与用户交互的窗口,一个Activity占据当前的窗口,响应所有窗口事件,具备有控件,菜单等界面元素。从内部逻辑来看,Activity需要为了保持各个界面状态,需要做很多持久化的事情,还需要妥善管理生命周期,和一些转跳逻辑。

注意:
1. 首先一个应用程序可以有一个或者多个Activity的活动页面。
2. 每一个应用程序都需要有一个activity入口,也就相当于程序的入口。唯一不同的他的入口地址需要在androidmianfest.xml中配置
3. 启动一个activity的时候要跳转到另一个activity中就需要Intent的组件。

Activity的生命周期

activity_lifecycle

Activity的状态

  1. active/running:Activity处于前台并且在Activity栈的栈顶
  2. paused:Activity失去焦点但仍然可见,例如当一个非全屏的透明Activity在当前Activity的上方时,会进入paused状态,在内存极度匮乏的时候,处于paused状态的Activity可能被系统杀死
  3. stoped:当Activity被另一个Activity完全覆盖的时候,会处于stoped状态,当系统需要更多内存时可能会杀死处于该状态的Activity
  4. killed:当处于paused或者stoped状态的Activity被系统从内存中删除后,会处于killed状态
MethodDescriptionKillable?Next
onCreate()当Activity第一次被创建的时候调用,可以在这里设置静态参数,加载View,将数据绑定到lists等。如果这个Activity曾经被冻结过,那么可以通过提供的Bundle参数来恢复之前的状态onStart()
onRestart()当Activity从stopped状态重新启动的时候调用onStart()
onStart()当Activity变得可见的时候被调用onResume() 或 onStop()
onResume()当用户可以与Activity交互的时候被调用onPause()
onPause()当系统准备resume其它Activity时被调用,可以在这里提交未保存的数据,停止动画以及其它任何需要CPU计算的事务。在这里不要做太耗时的操作,否则下个Activity会被阻塞HONEYCOMB之前的版本可以onResume()或onStop()
onStop()当Activity变得不可见时被调用可以onRestart()或onDestroy()
onDestroy()Activity被destroy之前最后被调用的方法可以

Activity的创建

  1. 新建一个类,继承Activity,重写onCreate方法

    public class MainActivity extends Activity {//继承Activity 活动(界面)
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {//程序的入口
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);//设置内容视图
    }
    }
  2. 新建一个layout的xml文件
  3. 在AndroidManifest中注册Activity

Activity的切换

显式切换

通过Intent来实现启动一个明确的Activity

Intent intent = new Intent(ThisActivity.this, OtherActivity.class);
startActivity(intent);

隐式切换

首先需要在AndroidManifest中设置Activity的intent-filter信息,其中的action name原则上可以随意随意设置,最好使用包名.类名的结构,防止冲突。

<activity
    android:name="com.example.SecondActvity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="1234567890" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

然后在Intent中设置action信息,从而启动对应的Activity

Intent intent = new Intent();
intent.setAction("1234567890");
startActivity(intent);

Activity的启动模式

任务栈

任务栈Task,是一种用来放置Activity实例的容器,他是以栈的形式进行盛放,也就是所谓的先进后出,主要有2个基本操作:压栈和出栈,其所存放的Activity是不支持重新排序的,只能根据压栈和出栈操作更改Activity的顺序。

Standard模式

标准模式。可以有多个相同的实例,也允许多个相同Activity叠加。应用场景:绝大多数Activity。

Standard

singleTop模式

栈顶复用模式,如果要开启的activity在任务栈的顶部已经存在,就不会创建新的实例,而是调用 onNewIntent()方法。避免栈顶的activity被重复的创建。应用场景:在通知栏点击收到的通知,然后需要启动一个Activity,这个Activity就可以用singleTop,否则每次点击都会新建一个Activity。

singleTop

singleTask模式

栈内复用模式, activity只会在任务栈里面存在一个实例。如果要激活的activity,在任务栈里面已经存在,就不会创建新的activity,而是复用这个已经存在的activity,调用 onNewIntent()方法,并且清空这个activity任务栈上面所有的activity。应用场景:大多数App的主页。对于大部分应用,当我们在主界面点击回退按钮的时候都是退出应用,那么当我们第一次进入主界面之后,主界面位于栈底,以后不管我们打开了多少个Activity,只要我们再次回到主界面,都应该使用将主界面Activity上所有的Activity移除的方式来让主界面Activity处于栈顶,而不是往栈顶新加一个主界面Activity的实例,通过这种方式能够保证退出应用时所有的Activity都能报销毁。

singleTask

singleInstance模式

单一实例模式,整个手机操作系统里面只有一个实例存在。不同的应用去打开这个activity 共享公用的同一个activity。他会运行在自己单独,独立的任务栈里面,并且任务栈里面只有他一个实例存在。应用场景:呼叫来电界面。这种模式的使用情况比较罕见,在Launcher中可能使用。或者你确定你需要使Activity只有一个实例。建议谨慎使用。

设置启动模式

设置AndroidManifest

可以设置standard,singleTop,singleTask,singleInstance

<activity
    android:name="com.example.singletask.SecondAct"
    android:launchMode="singleTask"
    android:label="@string/app_name" >
</activity>

设置Intent的Flag

  1. FLAG_ACTIVITY_NEW_TASK

    使用一个新的Task来启动一个Activity,但启动的每个Activity都讲在一个新的Task中。该Flag通常使用在从Service中启动Activity的场景,由于Service中并不存在Activity栈,所以使用该Flag来创建一个新的Activity栈,并创建新的Activity实例。

  2. FLAG_ACTIVITY_SINGLE_TOP

    使用singletop模式启动一个Activity,与指定android:launchMode=“singleTop”效果相同。

  3. FLAG_ACTIVITY_CLEAR_TOP

    使用SingleTask模式来启动一个Activity,与指定android:launchMode=“singleTask”效果相同。

  4. FLAG_ACTIVITY_NO_HISTORY

    Activity使用这种模式启动Activity,当该Activity启动其他Activity后,该Activity就消失了,不会保留在Activity栈中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值