zoukankan      html  css  js  c++  java
  • Android:日常学习笔记(6)——探究活动(4)

    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");
  • 相关阅读:
    老鸟的Python新手教程
    vs2010经常使用快捷键
    SQL基础--&gt; 约束(CONSTRAINT)
    哈哈,做题了
    【网络协议】TCP中的四大定时器
    JAVA反射机制
    JUnit入门
    怎样将程序猿写出来的程序打包成安装包(最简单的)
    事件传递机制总结
    理解class.forName()
  • 原文地址:https://www.cnblogs.com/MrSaver/p/6863150.html
Copyright © 2011-2022 走看看