Android之路(1)—— Activity

Activity生命周期

在这里插入图片描述

  • onCreate(Bundle savedStatus) : 该方法用于对该Activity执行初始化,在创建Activity是被回调,该方法只会被回调一次。
  • onStart() : 启动Activity是被回调
  • onRestart() : 重新启动Activity是被回调
  • onResume() : 恢复Activity时被回调,在onstart()方法后一定会调用onResume()方法
  • onPause() : 暂停Activity时被调用
  • onStop() : 停止Activity时被调用
  • onDestroy() : 销毁Activity时 被调用,该方法只会被调用一次

Activity的4种加载模式

Android采用Task来管理多个Activity,当我们启动一个应用时,Android会为之创建一个Task,然后启动这个应用的入口Activity(intent-filter中配置为MAIN和LAUNCHER的Activity)。事实上,我们可以把Task理解成Activity栈,Task以栈的形式管理Activity:先启动的Activity被放在Tas栈底,后启动的放在栈顶。那么Activity的加载模式就是控制Activity与Task之间的加载关系。

  • standard模式
    标准模式,默认的加载模式。Android总会为目标Activity创建一个新的实例,并将该Activity添加到当前Task栈中——这种启动模式不会创建新的Task,新Activity被添加到原有的Task中。所以当多次启动同一个Activity后,按返回键也会“逐一”的返回。

  • singleTop模式:
    当要启动的目标Activity已经位于Task栈顶时,系统不会重新创建目标Activity的实例,而是直接复用已有的Activity实例。

  • singleTask模式
    保证同一个Task内只有一个实例
    ①若目标Activity不存在,系统自动创建实例并加入到栈顶
    ②若要启动Activity已经位于栈顶,此时与送了Top模式相同
    ③若要启动Activity已经存在但不位于栈顶,系统会将该Activity上面所有的Activity移除Task栈,使得目标Activity转入栈顶。

  • singleInstance模式:
    系统保证从那个Task启动目标Activity,只会创建一个目标Activity实例,并会使用一个全新的Task栈来加载这个Activity实例
    ①若目标Activity不存在,系统会创建一个全新的Task,在创建目标Activity,并将其加入到新的Task栈顶。
    ②若目标Activity已存在,无论它位于那个应用程序中、位于那个Task中,系统都会将该Activity的Task转到前台,从而使该Activity显示出来

AndroidManifest.xml中的配置

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity 
            android:name=".MainActivity"
            android:icon="@drawable/ic_launcher_background"
            android:label="测试"
            android:exported="true"
            android:launchMode="standard">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

如上所示:Activity标签在application标签中,在activity标签中配置属性:

  • name :指定该Activity实现类的类名
  • icon : 指定该Activity对应的图标
  • label : 指定该Activity对应的标签,即界面进入Activity左上角的名字
  • exported : 是否允许被其他应用调用
  • launchMode :指定Activity的加载模式:standard,singleTop,singleTask,singleInstance
  • intent-filter 标签 : 用来封装需要启动那个Activity(或其他组件)的 意图。具体详解看intent-filter的笔记。其中参数MANI和LAUNCHER表示此Activity为主活动。

启动/关闭Activity

  • 启动 : startActivity(Intent intent)
  • 关闭: finish()

启动其他Activity

有两种启动方法 显示启动 和 隐式启动

  • 显示启动:
    不需要在AndroidManife.xml中配置,相当于指名道姓的说明启动那个活动

    //从MainActivity跳转到FirstActivity
    Intent intent = new Intent(MainActivity.this,FirstActivity.class);
    startActivity(intent);
    
  • 隐式启动:
    需要在AndroidManife.xml中配置 在 intent-filter标签里指明 action 和 category。action 和 category标签中大写的参数值支持自定义,也可以使用系统设定的

其实,隐式启动中没有指名道姓的说要启动那个Activity,他是通过指出 我要启动的Activity具有哪些属性(action,category,data等),然后去启动符合这些属性的Activity。

被启动的FirstActivity 的在AndroidManife.xml配置:

<activity android:name=".FirstActivity">
            <intent-filter>
                <action android:name="android.intent.action.FIRSTACTIVITY"/>
                <category android:name="android.intent,category.FIRSTACTIVITY_CATEGORY"/>
                <category android:name="android.intent,category.DEFAULT"/>
            </intent-filter>
</activity>

源Activity:

public class MainActivity extends AppCompatActivity {

    public static final String FIRSTACTIVITY = "android.intent.action.FIRSTACTIVITY";
    public static final String FIRSTACTIVITY_CATEGORY = "android.intent,category.FIRSTACTIVITY_CATEGORY";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent();
        intent.setAction(MainActivity.FIRSTACTIVITY);
        intent.addCategory(MainActivity.FIRSTACTIVITY_CATEGORY);
        startActivity(intent);
    }
}

在Activity间传递数据

  • 直接使用Intent 智能化简单的方式(事实上也是悄悄创建Bundle)
    putExtra(String name, Xxx value)
    getXxxExtra(String name)
        //放数据
        Intent intent = new Intent(MainActivity.this,FirstActivity.class);
        intent.putExtra("username","Jack");
        
        //获得数据
        Intent intent = getIntent();
        intent.getStringExtra("username");
  • 使用信使 Bundle 传递数据
    Intent 下:
    putExtras(Bundle data)
    Bundle getExtrals()
    Bundle 下:
    putXxx(String name , Xxx value)
    putSerializable(String name , Serializable data) : 放自定义的对象
    getXxx(String key)
    getSerializable(String key , Serializable data)
        //放数据
        Bundle data = new Bundle();
        data.putString("username","Jack");
        Intent intent = new Intent(MainActivity.this,FirstActivity.class);
        intent.putExtras(data);

        //获得数据
        Intent intent = getIntent();
        Bundle data = intent.getExtras();
        String username = data.getString("username");

启动其他Activity并返回结果

使用场景:比如一个界面需要用户选择,但是选择的数据比较复杂,必须要开启另一个Activity,但是选择完要把数据返回个第一个Activity显示并处理。

  • 当前源Activity调用onActivityResult(int requestCode , int resultCode,Intent intent)

    因为可能源Activity启动的Activity较多,用requestCode请求码区分启动的不同Activity
    而resultCode是一个被启动的Activity中可能返回多种不同的返回码

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Intent intent = new Intent(MainActivity.this,FirstActivity.class);
        startActivityForResult(intent,1);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode){
            case 1:
                //处理业务逻辑
                if(resultCode == RESULT_OK ){
                    ....
                }
                break;
                default:break;
        }
    }
  • 被调用的Activity调用setResult(int resultCode,Intent data)方法返回设置的结果
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);

        Intent intent = new Intent();
        intent.putExtra("username","Jack");
        setResult(RESULT_OK,intent);
    }

其他

  • 知晓当前是那个活动

写一个基础活动类,让所有的Activity都继承它即可

/**
 - 基础活动类
 */
public class BaseActivity extends AppCompatActivity {
    private static final String TAG = "BaseActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG,getClass().getSimpleName());
        ActivityCollector.addActivity(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }
}
  • 随时随地退出程序
/**
 * 用于便捷的增删活动
 */
public class ActivityCollector {
    public static List<Activity> activities = new ArrayList<>();

    public  static void addActivity(Activity activity){
        activities.add(activity);
    }

    public static void removeActivity(Activity activity){
        activities.remove(activity);
    }

    public static void finishAll(){
        for(Activity activity : activities){
            if (!activity.isFinishing()){
                activity.finish();
            }
        }
        activities.clear();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值