关于Activity启动,总有些东西你可能不清楚(二)

    xiaoxiao2021-03-25  85

    如果你喜欢分享,一起加入群:524727903

    更新了图片2017.10.22

    FLAG_ACTIVITY_CLEAR_TOP


    现不妨说一下结论

    例如A启动B 1. FLAG_ACTIVITY_CLEAR_TOP和Intent.FLAG_ACTIVITY_SINGLE_TOP配合使用相当于B在manifest文件中设置singTask,==会==回调onNewIntent(); 2. FLAG_ACTIVITY_CLEAR_TOP和Intent.FLAG_ACTIVITY_NEW_TASK配合使用相当于B在manifest文件中设置singTask,==不会==回调onNewIntent(); 3. 只设置FLAG_ACTIVITY_CLEAR_TOP,在此上面的Activity都会出栈(包括自己),并且在创建一个新的实例入栈。


    下面我们就根据源码来验证上面三条结论吧:

    ==第一条结论==

    public class MainActivity extends AppCompatActivity { private TextView tv; private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState != null) { String yaoyan = savedInstanceState.getString("yaoyan"); System.out.println("onCreate-yaoyan = " + yaoyan); } System.out.println("MainActivity.onCreate.this = " + this); } public void jumpsecondActivity(View view) { Intent intent = new Intent(); intent.setClass(this,secondActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP|Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); } } public class secondActivity extends Activity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.scond_activity); System.out.println("secondActivity.onCreate.this"+this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); System.out.println("secondActivity.onNewIntent.this = " + this); } public void jumpMainActivity(View view){ Intent intent = new Intent(); intent.setClass(this,ThiredActivity.class); startActivity(intent); } } public class ThiredActivity extends Activity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.thired_activity); System.out.println("ThiredActivity.onCreate.this = " + this); } public void jumpOther(View view) { Intent intent = new Intent(); intent.setClass(this, secondActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); System.out.println("ThiredActivity.onNewIntent.this = " + this); } }

    布局就是普通布局文件,里面有按钮可以跳转而已,布局文件和manifest文件都不粘了。

    结果

    图一

    参照第一条结论,是不是相当于在secondActivity中设置了singTask属性。


    ==第二条结论==

    我们把代码稍微修改下

    public void jumpsecondActivity(View view) { Intent intent = new Intent(); intent.setClass(this,secondActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } public void jumpOther(View view) { Intent intent = new Intent(); intent.setClass(this, secondActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }

    在manifest里面对secondActivity进行修改

    <activity android:name=".secondActivity" android:taskAffinity="com.xie.yaoyan"></activity>
    结果

    大家可以看到使用FLAG_ACTIVITY_CLEAR_TOP和Intent.FLAG_ACTIVITY_NEW_TASK配合使用不仅不会调用onNewIntent方法,还会把secondActivity销毁掉运行onDestory(),并且重新创建新的实例放入栈中。

    下面我们来看看三次点击,栈里面都发生了些什么(四条信息,第一条是进来之后就有的):

    第一次点击

    新开辟了一个栈,将secondActivity放入栈中。

    第二次点击

    将ThirdActivity放入新栈中

    第三次点击

    将secondActivity和ThirdActivity统统弹栈,并在此创建一个secondActivity放入栈中。


    ==第三条结论==

    public void jumpsecondActivity(View view) { Intent intent = new Intent(); intent.setClass(this,secondActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); } public void jumpOther(View view) { Intent intent = new Intent(); intent.setClass(this, secondActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); } <activity android:name=".secondActivity"></activity>

    跟上一个结论没什么两样,这里就不重复了。

    转载请注明原文地址: https://ju.6miu.com/read-33918.html

    最新回复(0)