Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android活动的唯一id_Android_Android Activity - Fatal编程技术网

android活动的唯一id

android活动的唯一id,android,android-activity,Android,Android Activity,我需要获取android活动实例的唯一id。我想获取activitymanager在日志中写入的字符串(例如:activitymanager:ActivityPause timeout for HistoryRecord{450495a0…}),但我不知道如何获取它 有人知道我怎么才能弄到这根绳子吗?或者每个活动实例是否有另一个唯一id?也许您可以使用活动的hashCode。hashCode()方法在activity中,它返回android活动实例的唯一id,但getTaskId()不能在项目中

我需要获取android活动实例的唯一id。我想获取activitymanager在日志中写入的字符串(例如:activitymanager:ActivityPause timeout for HistoryRecord{450495a0…}),但我不知道如何获取它


有人知道我怎么才能弄到这根绳子吗?或者每个活动实例是否有另一个唯一id?

也许您可以使用活动的hashCode。

hashCode()
方法在
activity
中,它返回android活动实例的唯一id,但
getTaskId()
不能在项目中的每个地方返回唯一值:

    MainActivity.class.hashCode(); 
活跃

    this.hashCode();

您甚至可以从上下文中获取
hashCode
我知道这个问题有点过时,但出于某些原因,我需要这个问题


如果您想保留更长的时间,那么使用活动的hashCode方法不是一个好主意。众所周知,操作系统可以清理活动。这意味着,当它们被重新创建时,它们的哈希代码可能与以前的实例不同。解决这个问题的一个方法(如果您想使用整数作为id)可以是getIntent().hashCode()

正如在另一个答案中正确指出的那样,操作系统可以重新创建活动,因此使用
Activity.hashCode()
不是一个可靠的解决方案。此外,可以重新创建整个应用程序进程(例如,在权限更改之后),这意味着任何运行时/非持久化ID都不可信。正确的解决方案是在
onCreate(Bundle)
期间手动生成唯一ID(或者从
savedInstanceState
读取它,如果存在),然后在
onSaveInstanceState(Bundle)
期间保存它

另一个问题是生成真正唯一的ID。最简单和最可靠的解决方案是保留一个静态计数器,但由于应用程序进程可能会死亡,因此需要更加小心

为了将样板代码减至最低,我创建了一个专门的类:

public class ActivityUUID {

    private static final String INSTANCE_DATA_ID = "BwsKCwYBDg8GAQ4LBAgAAA"; // NOTE Any globally unique ID
    private static final String UUID_NODE_ID = "a";
    private static final long INVALID_UUID = 0;

    private static long _lastActivityUUID = INVALID_UUID; // NOTE All activity callbacks are guaranteed to be made from UI thread, so no synchronization is required
    private static SharedPreferences _persistentData;

    private final long _uuid;

    public ActivityUUID(Context context, Bundle savedInstanceState) {
        _uuid = readUUID(context, savedInstanceState);
    }

    public long get() {
        return _uuid;
    }

    public void onSaveInstanceState(Bundle outState) {
        outState.putLong(INSTANCE_DATA_ID, _uuid);
    }

    private static long readUUID(Context context, Bundle savedInstanceState) {
        long result = (savedInstanceState != null) ? savedInstanceState.getLong(INSTANCE_DATA_ID, INVALID_UUID) : INVALID_UUID;
        return (result != INVALID_UUID) ? result : generateUUID(context);
    }

    private static long generateUUID(Context context) {
        if (_persistentData == null) {
            _persistentData = context.getSharedPreferences(INSTANCE_DATA_ID, Context.MODE_PRIVATE);
            _lastActivityUUID = _persistentData.getLong(UUID_NODE_ID, INVALID_UUID);
        }

        long result = ++_lastActivityUUID;
        if (result != INVALID_UUID) {
            _persistentData.edit().putLong(UUID_NODE_ID, result).apply();
        } else {
            throw new RuntimeException("You have somehow managed to create a total of 9223372036854775807 activities during lifetime of your app! =)");
        }
        return result;
    }

}
用法非常简单:

private ActivityUUID _activityUUID;

@Override
public final void onCreate(Bundle savedInstanceState) {
    _activityUUID = new ActivityUUID(this, savedInstanceState);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    _activityUUID.onSaveInstanceState(outState);
}

// ...somewhere else in the code
long activityUUID = _activityUUID.get();

定义域的唯一性。对不起,我不知道你的意思。唯一性在哪里?在设备中是唯一的吗?地球上独一无二的?宇宙中独一无二的?获得activitymanager的字符串会很好,但哈希代码当然也能完成这项工作。如果我不能得到这个特定的字符串,我会使用hashcode,但另一个sting会让我更容易调试。OP需要每个活动实例有一个唯一的id,所以我不明白为什么使用hashcode不好。