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

活动的启动模式

standard模式

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

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

  

说明:

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

singleTop模式

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

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

  

说明:

  如果某个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;

  

创建方式:

        <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实例;

  

活动的最佳实践

知晓当前是哪一个活动

我们可以包装一下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");

最新文章

  1. mybatis_个人总结
  2. 你知道QQ有多少人同时在线么
  3. JavaScript 中 2个等号(==)和 3个等号(===)之间的区别
  4. linux安装qwt插件linux
  5. php curl_exec optimize
  6. php 前台数据显示
  7. vstemplate关键点纪要
  8. CF div2 D BFS
  9. 团队作业4——第一次项目冲刺(Alpha版本) 2017.4.23
  10. Java构造器:级联调用,调用兄弟构造器
  11. Ubuntu16.04安装之后连不上无线网?有可能是Realtek rtl8822be的原因
  12. python---- pyqt 十字光标
  13. unity UI如何开启(显示)或者关闭(隐藏)Panel界面最好?
  14. mysql 主从库同步
  15. 不用Visual Studio,5分钟轻松实现一张报表
  16. ActiveMQ、RabbitMQ、RocketMQ、Kafka有什么优点和缺点
  17. codeforces 592B/C
  18. $obj
  19. shell 字符串提取数字
  20. playfair

热门文章

  1. mysql workbench 将查询结果导出 sql 文件
  2. mysql之log-slave-updates参数
  3. ASP.NET MVC 表单提交多层子级实体集合数据到控制器中
  4. 读写文件,用代码在讲html文件转为jsp文件
  5. constructors and destructors
  6. 如何给Eclipse添加一个JDK或JRE
  7. ssl 生成证书
  8. SVD分解的c++代码(Eigen 库)
  9. js创建对象的最佳方式
  10. PHP设置时区的方法