ane*_*nel 6 android android-activity
我需要获取一个android活动实例的唯一ID.我想把活动管理器在日志中写入的字符串(例如:ActivityManager:HistoryRecord的活动暂停超时{ 450495a0 ...}),但我不知道如何获取它.
有人知道我怎么能得到这个字符串?或者每个活动实例还有另一个唯一ID吗?
正如另一个答案中正确指出的那样,活动可以由操作系统重新创建,因此使用Activity.hashCode()不是一个可靠的解决方案。此外,整个应用程序进程可以重新创建(例如,在权限更改之后),这意味着任何运行时/非持久 ID 都不能被信任。正确的解决方案是在 期间手动生成唯一 ID onCreate(Bundle)(或从 读取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;
}
}
Run Code Online (Sandbox Code Playgroud)
用法非常简单:
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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9288 次 |
| 最近记录: |