Android:日常学习笔记(6)——探究活动(4)

时间:2021-10-19 13:02:01

Android:日常学习笔记(6)——探究活动(4)

活动的启动模式

standard模式

  standard是活动默认的启动模式,在不进行显示定义的情况下,所有活动都会自动使用这种启动模式

  standard模式:每次激活Activity时(startActivity),都创建Activity实例,并放入任务栈

  Android:日常学习笔记(6)——探究活动(4)

说明:

    对于standard模式启动的活动,系统不在乎这个活动是否已经在返回栈中存在,每次启动都会创建一个新的实例。

singleTop模式

  standard模式会存在一个问题:明明已经在栈顶的活动,为什么再次启动的时候还要创建一个新的活动实例呢?如果不想启动新的实例,可以使用singleTop

  singleTop模式:在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。

  Android:日常学习笔记(6)——探究活动(4)

说明:

  如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例;

  修改默认的启动模式方法如下:

        <activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar"
android:launchMode
="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

singleTask模式

  使用singleTop可以解决重复创建栈顶元素的问题,但是,如果这个活动没有再栈顶,还是会创建多个活动实例。如何解决不在栈顶创避免创建重复活动的问题呢?

  singleTask模式:如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都pop;

  Android:日常学习笔记(6)——探究活动(4)

创建方式:

        <activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar"
android:launchMode
="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

singleInstance模式

  singleInstance:如果应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例;

  Android:日常学习笔记(6)——探究活动(4)

活动的最佳实践

知晓当前是哪一个活动

我们可以包装一下AppCompatActivity,让所有的活动继承自这个活动,从而让我们清楚我们当前创建的活动是哪一个!

public class BaseActivity extends AppCompatActivity {

    @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity",getClass().getSimpleName());
}
}

 说明:

  这个类不需要再AndroidManifest中注册,它只是一个简单的Java类!

随时随地退出程序

  如果你现在不在MainActivity,那么你需要按多个Back键才能退出程序,我们可以建立一个专门的集合类对所有的活动进行管理。

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 finshAll()
{
for(Activity activity:activities)
{
if(!activity.isFinishing())
activity.finish();
}
}
}

然后我们再BaseActivity中加入命令

public class BaseActivity extends AppCompatActivity {

    @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity",getClass().getSimpleName());
ActivityCollector.addActivity(this);
} @Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}

启动活动的最佳写法

我们可以给活动添加一个类似于含参数的构造方法的方法,便于将该活动所需要的值快速传入。

public class SecondActivity extends AppCompatActivity {
public static void actionStart(Context context,String data1,String data2)
{
Intent intent = new Intent(context,SecondActivity.class);
intent.putExtra("param1",data1);
intent.putExtra("param2",data2);
context.startActivity(intent);
}
.....
}

这样我们以后就可以这样启动这个活动了,也不用频繁编写Intent了:

SecondActivity.actionStart(MainActivity.this,"data1","data2");