服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - 详解Activity之singletast启动模式及如何使用intent传值

详解Activity之singletast启动模式及如何使用intent传值

2021-04-09 14:22安卓之家 Android

在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该

Activity的四种启动模式:

    1. standard

        模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。

    2. singleTop

        如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。

    3. singleTask

        如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。

    4. singleInstance

在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。

因为项目中,有一个消息推送的功能,每次推送一个消息,就会开启FunctionActivity,那么为了避免重复开启它,在退后的时候,多次出现该Activity,就将该Activity的启动模式变为singleTask。

这样在之后的多次启动该Activity,便会调用onNewIntent(Intent intent)方法。

activity通过intent传递数据的时候,如果activity未启动,那么 在这个刚启动的activity里通过getIntent()会获取到这个intent的数据.如果要启动的activity是已经存在的,这时候通过 getInten()方法获取到的intent是已启动的activity的原始intent.换句话说intent的数据没有更新.这样在已启动的 activity里拿到的intent的数据是旧数据.如果要每次获取intent传来的新数据就需要在onNewIntent(Intent intent)方法里调用setIntent(intent)设置这个传来的最新的intent.如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.e("tag", "onNewINtent执行了");
setIntent(intent);
String ringName = intent.getStringExtra("ringName");
Log.e("tag", ringName+"传过来的值");
if (ringName != null) {
pager.setCurrentItem(1);
}
}

当然,如果activity的启动模式是standard,那么每次都重新创建一个新的activity.这样intent也是最新的.就不用通过setIntent来更新这个intent.

我这个项目中,FunctionActivity中里面是四个Fragment,这样 我从其他Activity跳转到FunctionActivity是不会实例化,通过getIntent()方法也不能获得最新的intent,为了解决 这个办法。还是在onNewIntent方法中,将更新的intent通过getIntent().putExtras(intent);共享出去,如下 所示:

?
1
2
3
4
5
6
7
@Override
 protected void onNewIntent(Intent intent) {
 super.onNewIntent(intent);
 Log.e("tag", "onNewINtent执行了");
 setIntent(intent);
 getIntent().putExtras(intent);
 }

这样在与它关联的Fragment中,就可以调用

?
1
2
3
4
5
6
7
8
9
10
11
12
@Override
 public void onResume() {
 super.onResume();
 // 第一次进入这个页面,下面的方法是不会执行的,因为ringName是null
 String ringName = getActivity().getIntent().getStringExtra("ringName");
 if (ringName != null) {
 newSound.setText(ringName);
 Log.e("tag", ringName + "要保存的值");
 SharedPreferenceUtil.setString(getActivity(),
  SharedPreferenceUtil.RINGTONE_NAME, ringName);
 }
}

注意,这里Fragment调用的时候,一定要在onResume方法中。

延伸 · 阅读

精彩推荐