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");

 

posted @ 2017-05-16 19:10  子烁爱学习  阅读(259)  评论(0编辑  收藏  举报