四大组建|Activity的用法和启动模式

Activity:最吸引用户的地方,是一种可以包含用户界面的组建,主要与用户交互。
本篇主要介绍Activity的基本使用,不包括生命周期。

  • Activity的基本用法
  • Activity的四种启动模式
  • Activity的两种优化

基本用法:

  • Activity在AndroidManifest的注册:

        
        
                
                
        
    

android:label :指定activity标题栏名称

  • 活动间启动Intent:
  1. 显示启动(常用):
    Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
    //不获取下一层活动的结果值
    startActivtiy(intent);
    //获取下一层活动的结果值,需重写onActivityResult 对结果值进行处理 
    startActivityForResult(inent, REQUEST_CODE);
  1. 隐式启动(多用于调用系统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中通过给标签android:launchMode属性来选择启动模式。
若系统调用activity是创建新实例,调用activity的onCreate()方法;若无创建新实例,则调用onNewInstance()方法。

  1. standard:是活动默认的启动模式。在standard模式下,启动一个新活动,系统不会在乎这个活动是否已经存在返回栈中,都会创建一个新实例。
  2. singleTop:在启动活动时如果发现栈顶已经是该活动了,则直接使用该活动实例,不新建实例。简称栈顶复用。
    适合接收推送启动内容。如某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。
  3. singleTask:启动该活动时,系统会先检查返回栈内是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把这个活动之上的所有活动出栈;如果没有发现,则新建一个实例。简称栈内复用。
    适用于作为程序入口点,a界面购物,b界面确认订单,c界面付款,如果付款成功会跳到a,如果不付款则返回b,这时候重启a就会用到singleTask。重启a的时候会把b出栈
  4. 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的四种启动模式的介绍及其应用场景

你可能感兴趣的:(四大组建|Activity的用法和启动模式)