Activity为安卓四大组件之一(Activity/Service/BroadCast Recevicer/Content provider)。Activity主要负责与用户交互,提供一个显示的屏幕。
public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
//...
}
}
代码中继承的AppCompatActivity类与Activity类的区别在于,AppCompatActivity类对很多控件做了向下兼容参考博客1。
AndroidManifest.xml
文件中注册该Activity。<activity
android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
intent-filter
用于过滤Intent的属性,匹配成功才能启动该Activity参考博客2。个人认为上面代码中的action和category内的信息的意义相当于表示启动该APP的时候会发出启动命令(包含这两条相同的action和catergory),过滤后即匹配上了MainActivity类,将该类当做启动的Activity初始化。
finish()
即可销毁当前的Activity。一个app可能有多个Activity,新的Activity会覆盖在旧的Activity上,而Activity使用栈(后进先出)来存储多个Activity。
每个Activity在其生命周期内最多会有4种状态:
1.运行状态
当一个Activity处于栈顶的时候,就是运行状态。
2.暂停状态
当一个Activity不处于栈顶,但是属于可见的状态(别的Activity部分遮挡了该Activity),就进入了暂停状态。
3.停止状态
当一个Activity不处于栈顶,并且完全不可见的时候,就进入了停止状态,系统会为其保留状态和变量,但是当内存不足的时候随时会被系统回收。
4.销毁状态
当一个Activity从返回栈移除后,就变成了销毁状态。
Activity在各种状态之间切换时会调用相应的方法,如下:
OnCreate()
:Activity第一次被创建的时候调用,可以在这里完成初始化和事件调用操作。OnStart()
:在Activity由不可见变得可见的时候调用。OnResume()
:在Activity准备好和用户进行交互的时候调用。OnPause()
:在Activity部分可见的时候调用。OnStop()
:在Activity完全不可见的时候调用。OnDestroy()
:在Activity销毁的时候调用。OnRestart()
:在Activity由不可见重新变为运行状态前调用。参考生存周期图,来自参考博客3:
如果进程被系统杀掉了,则会直接调用OnCreate而不是OnRestart,同时由于一些临时数据会丢失,会影响用户体验,因此需要使用Activity中的OnSaveInstanceState方法来解决这个问题。OnSaveInstanceState方法会携带一个Bundle类型参数,可以提供一系列的方法保存变量。同时恢复的时候只需要在OnCreate()
函数的第一个Bundle参数中即可获取。
在实际项目中可以为指定的Activity设置如下四种启动模式:
以上四种都可以在AndroidManifest.xml
文件中通过给
指定android:launchMode
属性来设置,接下来分别介绍四种启动模式。
1.standard
默认的启动模式。每启动一个新Activity,就会在返回栈中入栈,并且处于栈顶位置,同时不管这个Activity是否已经在栈中存在,都会创建该Activity的新实例。
2.singleTop
与标准方式的区别在于,当启动新Activity时,如果发现Activity在栈中已经存在并且在栈顶,那么就不会创建新的实例而是用栈顶的这个实例。
3.singleTask
与singleTop模式的区别在于,当启动新Activity时,如果发现当前的Activity实例存在,不管是否在栈中哪个位置,都会将在该Activity上面的Activity实例全部出栈,然后使用该Activity。如果不存在则与标准模式相同,启动一个新的Activity。
4.singleInstance
与上面三种模式都不同,该模式下,指定了singleInstance的Activity会在一个新的返回栈中处理,这个返回栈可以与其它程序共享(注意,每个程序都有自己的返回栈),这样的意义在于,不同的程序可以共享同一个Activity实例。
Intent是安卓程序中各个组件之间交互的一种重要方式,不仅可以执行各种动作,还可以传递数据。例如用于启动Activity、启动服务,发送广播等。同时Intent可以分为显式Intent和隐式Intent。
直接指定要启动的Activity。
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
隐式Intent不明确指定启动哪个Activity,而是设置Action、Data、Category,让系统来筛选出合适的Activity。筛选是根据所有的
来筛选。
<activity android:name="com.example.app.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
action
是一个字符串,表示执行的动作,category
表示动作的类别,只有两个都匹配上了才能成功,并且支持跨程序调用。同时,action
和category
都可以自定义。
<intent-filter>
<action android:name="android.intent.action.DIY_ACTION" />
<category android:name="android.intent.category.DIY_CATEGORY" />
</intent-filter>
第一个Activity启动第二个Activity:
Intent intent = new Intent("com.example.app.SecondActivity");
intent.putExtra("str","hello world");
startActivity(intent);
第二个Activity接收第一个传来的数据:
getIntent().getStringExtra("str");
当然还可以结合Intent和Bundle,同时保存多个数据在Bundle中再将Bundle放在Intent中进行传递数据。
第一个Activity启动第二个Activity:
Intent intent = new Intent("com.example.app.SecondActivity");
startActivityForResult(intent,1);
第二个Activity返回数据:
Intent data = new Intent();
data.putExtra("str","helloworld");
setResult(1,data);
finish();
这里的data只用来传递数据,没有任何意图。
第一个Activity接收数据:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==1)
{
//...
}
}