android属性之noHistory

有没有这样的需求?跳出某个Activity之后,其作为跳板的作用完成了,自然也就没有存在的必要了(点击返回键时不想再看到它)。

这里就要介绍noHistory属性,设置这个属性为true的Activity不可见之后,其记录就会被抹去,杀Activity于无形,当然其默认值也是为false。

下面举个例子说明一下,还是两个Activity,一个MainActivity,一个ActivityTest。

MainActvity.java:

package com.example.administrator.myapplication;

import
android.content.Intent;
import
android.support.v7.app.AppCompatActivity;
import
android.os.Bundle;
import
android.util.Log;
import
android.view.View;
public class
MainActivity extends AppCompatActivity {
   public static final String TAG = "yayun";
   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       
Log.d(TAG, "onCreate: taskId" + getTaskId());
       
setContentView(R.layout.activity_main);
   
}
   public void launch(View view) {
       Intent intent = new Intent();
       
intent.setAction("yayun");
       
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
       
startActivity(intent);
   
}
   @Override
   
protected void onDestroy() {
       super.onDestroy();
       
Log.d(TAG, "onDestroy: MainActivity");
   
}
}

设置了launch方法,放在了onClick属性中,这个用法大家应该都熟悉吧。通过Intent启动第二个Activity。

ActivityTest.java:

package com.example.administrator.myapplication;

import
android.app.Activity;
import
android.content.Intent;
import
android.os.Bundle;
import
android.util.Log;
import
android.view.View;
import
android.widget.TextView;

/**
* Created by Administrator on 2016/7/31.
*/
public class ActivityTest extends Activity {
   public static final String TAG = "yayun";
   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       
Log.d(TAG, "onCreate: taskId" + getTaskId());
       
setContentView(R.layout.activity1_layout);
   
}  

   @Override
   
protected void onDestroy() {
       super.onDestroy();
       
Log.d(TAG, "onDestroy: ActivityTest");
   
}
}

主角会出现在AndroidManifest.xml:

xml version="1.0" encoding="utf-8"?>
xmlns:android="http://schemas.android.com/apk/res/android"
   
package="com.example.administrator.myapplication">

           
android:allowBackup="true"
       
android:icon="@mipmap/ic_launcher"
       
android:label="@string/app_name"
       
android:supportsRtl="true"
       
android:theme="@style/AppTheme">
                   
android:name=".MainActivity"
           
android:excludeFromRecents="true"
           
android:noHistory="true">
           
               android:name="android.intent.action.MAIN" />
               android:name="android.intent.category.LAUNCHER" />
           

       
                   
android:name=".ActivityTest"
           
android:finishOnTaskLaunch="true"
           
android:taskAffinity=".yayun">
           
               android:name="yayun" />
               android:name="android.intent.category.DEFAULT" />
           

       
   

将MainActivty的noHistory属性设置成了true,下面运行实例看一下效果:

android属性之noHistory_第1张图片

启动ActivityTest之后,在点击返回,直接回到了桌面,也就是说MainActivity存在的历史被清空了。同理三个Activity依次启动,Activity1->Activity2->Activity3,如果我们将Activity2的noHistory属性设置成了true,那么在Activity3点返回时将回到Activity1。

这个属性一般用于特殊逻辑的处理,比如跳出这个Activity就不想再看到它,就可以用设置这个Activity的noHistory属性为true。

看一下Log:


点击返回跳到桌面后,两个Activity的destroy方法都运行了。

上面介绍的这个属性是配置在AndroidManifest文件中的,不够灵活?可不可以在代码中动态设置呢?当然是可以的,一般来讲,每一个属性都会有其动态设置的方法。

下面通过一个实例看一下,如何动态设置Activity的noHistory属性。

修改MainActivity的launch方法如下:

public void launch(View view) {
   Intent intent = new Intent(this, ActivityTest.class);
   
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                     Intent.FLAG_ACTIVITY_NO_HISTORY);
   
startActivity(intent);
}

注意,这里将是会为ActivityTest设置noHistory的属性,也就是说离开ActivityTest(调用onPause)时,就再也回不去了。

这时看一下效果:

android属性之noHistory_第2张图片

启动ActivityTest之后,点击Home键,然后从recents再次进入,可以看到直接跳到了MainActivity,也就是说ActivityTest的历史记录被删除了。

从log信息可以看到,在点击recents的一瞬间,ActivityTest的onDestroy方法就运行了,ActivityTest就被销毁了。

最后,宣传一下我的书籍:(亚马逊和百度阅读有售)

《android百战经典》

android属性之noHistory_第3张图片

《android控件操作二十四章经》

android属性之noHistory_第4张图片


谢谢关注我的微信公众号,觉得好可以分享到朋友圈哦.

android属性之noHistory_第5张图片

请关注我的新浪微博:AndroidTip

CSDN博客:http://blog.csdn.net/yayun0516


你可能感兴趣的:(Android,android,android,studio,android开发)