Android|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:

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=".ActivityTest"
android:finishOnTaskLaunch="true"
android:taskAffinity=".yayun">

android:name="yayun" />





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

Android|android属性之noHistory
文章图片


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

这个属性一般用于特殊逻辑的处理,比如跳出这个Activity就不想再看到它,就可以用设置这个Activity的noHistory属性为true。
看一下Log:
Android|android属性之noHistory
文章图片


点击返回跳到桌面后,两个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|android属性之noHistory
文章图片

启动ActivityTest之后,点击Home键,然后从recents再次进入,可以看到直接跳到了MainActivity,也就是说ActivityTest的历史记录被删除了。
从log信息可以看到,在点击recents的一瞬间,ActivityTest的onDestroy方法就运行了,ActivityTest就被销毁了。
最后,宣传一下我的书籍:(亚马逊和百度阅读有售)
《android百战经典》
Android|android属性之noHistory
文章图片


《android控件操作二十四章经》
Android|android属性之noHistory
文章图片




谢谢关注我的微信公众号,觉得好可以分享到朋友圈哦.
Android|android属性之noHistory
文章图片

请关注我的新浪微博:AndroidTip
【Android|android属性之noHistory】CSDN博客:http://blog.csdn.net/yayun0516

    推荐阅读