Activity:最吸引用户的地方,是一种可以包含用户界面的组建,主要与用户交互。
本篇主要介绍Activity的基本使用,不包括生命周期。
- Activity的基本用法
- Activity的四种启动模式
- Activity的两种优化
基本用法:
- Activity在AndroidManifest的注册:
android:label :指定activity标题栏名称
- 活动间启动Intent:
- 显示启动(常用):
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
//不获取下一层活动的结果值
startActivtiy(intent);
//获取下一层活动的结果值,需重写onActivityResult 对结果值进行处理
startActivityForResult(inent, REQUEST_CODE);
- 隐式启动(多用于调用系统app):不指明我们想要启动的哪一个活动,而是指定一系列抽象的action和category等信息,然后交给系统去分析这个Intent,并帮助我们找到合适方法去启动。action和category是在
中指定的。action是唯一一个,而category可以有多个。
"android.intent.category.DEFAULT"是一种默认的category,在调用startActvity()时会自动将这个category添加到intent中。
Intent intent = new Intent("com.example.projectname.ACTION_START");
startActivity(intent);
使用隐式Intent调用其他程序活动示例:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://baidu.com")";
startActivity(intent);
setData()需转化成指定数据类型,也可以在
各种data标签配置如下:
android:scheme,用于指定数据的协议部分,如http。
android:host,用于指定数据的主机名部分,如www.baidu.com。android:port,端口号。
android:path,路径
android:mimeType,指定处理数据类型,允许使用通配符的方式指定。
Activity的四种启动模式即其应用场景:
启动模式可以在AndroidManifest.xml中通过给
若系统调用activity是创建新实例,调用activity的onCreate()方法;若无创建新实例,则调用onNewInstance()方法。
- standard:是活动默认的启动模式。在standard模式下,启动一个新活动,系统不会在乎这个活动是否已经存在返回栈中,都会创建一个新实例。
- singleTop:在启动活动时如果发现栈顶已经是该活动了,则直接使用该活动实例,不新建实例。简称栈顶复用。
适合接收推送启动内容。如某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。
- singleTask:启动该活动时,系统会先检查返回栈内是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把这个活动之上的所有活动出栈;如果没有发现,则新建一个实例。简称栈内复用。
适用于作为程序入口点,a界面购物,b界面确认订单,c界面付款,如果付款成功会跳到a,如果不付款则返回b,这时候重启a就会用到singleTask。重启a的时候会把b出栈
- singleInstance:在这种模式下,启动该活动,系统会创建一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用一个返回栈,也就解决了共享活动实例的问题。
适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题。比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。
Activity优化:
1. 创建基类:
方便管理activity,打印各活动名和生命周期,可以方便我们查询目前是在哪个活动声明周期。也可声明抽象方法调用顺序,initView()和initData()等,方便写新aactivity时,逻辑可以更加清晰。
抽象基类不需要在AndroidManifest.xml中注册,直接创建类并继承AppCompatActivity即可。
public abstract class BaseActivity extends AppCompatActivity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
Log.v("BaseActivity", getClass().getSimpleName() + "--------onCreate---------");
Log.v("BaseActivity", "taskId=" + getTaskId() + ",pid=" + Process.myPid() + "\n-------------------------");
super.onCreate(savedInstanceState);
setContentView(getContentView());
initView();
initData();
}
.....//打印其他生命周期
protected abstract void initView();
protected abstract void initData();
}
2. 随时随地退出程序:
配合基类使用,新建一个ActivityCollector类作为活动管理器。代码如下:
public class ActivityCollector{
public Static List activities = new LinkedList<>();
public static void add(Activity activity){
activities.add(activity);
}
public static void remove(Activity activity){
activities.remove(activity);
}
public static void finishAll(){
for(Activity activity : activities){
if (!activity.isFinishing()){
activity.finish;
}
}
}
}
public abstract class BaseActivity extends AppCompatActivity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
ActivityCollector.add(this);
...
}
@Override
protected void onDestroy() {
ActivityCollector.remove(this)
}
}
3. 启动活动的最佳写法:
在活动中声明该方法
public static void actionStart(Context context, String data1, String data2){
Intent intent = new Intent(context, ActivityName.class);
intent.putExtra("param1", data1);
intent.putExtra("param2", data2);
}
这样写可以方便调用,不需要阅读Activity的代码就可以清楚地知道启动Activity需要传递哪些数据。
参考:
《第一行代码》
彻底弄懂Activity四大启动模式
Activity的四种启动模式的介绍及其应用场景