【发布时间】:2018-04-11 15:02:28
【问题描述】:
每次用户处于非活动状态 X 时间时,我都需要显示 Activity。我正在尝试通过自定义CountDownTimer 来实现这一点,它在我的BaseActivity 中以onUserInteraction 开头:
@Override
public void onUserInteraction() {
super.onUserInteraction();
inactivityTimer.cancel();
inactivityTimer.start();
}
在我的自定义CountDownTimer 中,我启动所需的Activity onFinish:
@Override
public void onFinish() {
BaseActivity baseActivity = new BaseActivity();
Log.i("TIMER ENDED: ", "NOW STARTING LOCKACTIVITY");
baseActivity.showLock();
}
这是我在BaseActivity 中的showLock() 方法
public void showLock() {
Intent intent = new Intent(getApplicationContext(), LockActivity.class);
startActivity(intent);
}
每次计时器结束时,我都会得到一个 NPE。 (java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference) 即使我尝试使用getApplication().getBaseContext()、this、this.getBaseContext()、this.getApplicationContext()、getApplicationContext()and
getBaseContext() 而不是 getApplicationContext()
但是,如果我像这样在方法调用中设置Context:
@Override
public void onFinish() {
BaseActivity baseActivity = new BaseActivity();
Context context = MyApplication.getInstance().getApplicationContext();
Log.i("TIMER ENDED: ", "NOW STARTING LOCKACTIVITY");
baseActivity.showLock(context);
}
这个在showLock():
public void showLock(Context context) {
Intent intent = new Intent(context, LockActivity.class);
startActivity(intent);
}
这次我又收到了一个 NPE (java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference)。
所以我的问题是,每次从当前的Activity 调用我的showLock() 时,我如何获得正确的Context,这将调用该方法?
重要提示:我项目中的每个Activity 都继承BaseActivity,而BaseActivity 本身又继承AppCompatActivity。
编辑
我尝试了 Marcin 的建议,在处理了几个错误后,我最终使用了他的方法。如果其他人很好奇并想知道如何在 X 量不活动后打开活动,这对我有用:
由于我所有的活动都继承了一个主要的BaseActivity,所以我放了一个自定义的Handler,其中包含一个WeakReference 到BaseActivity。我还覆盖了handleMessage,在这里我调用了我想要的方法:
private static class InactivityHandler extends Handler {
private WeakReference<BaseActivity> baseActivityWeakReference;
private InactivityHandler(BaseActivity baseActivity) {
baseActivityWeakReference = new WeakReference<>(baseActivity);
}
@Override
public void handleMessage(Message msg) {
BaseActivity baseActivity = baseActivityWeakReference.get();
if (baseActivity != null) {
baseActivity.showLock();
}
}
}
一段时间后,在onUserInteraction 中将Message 发送到队列:
@Override
public void onUserInteraction() {
super.onUserInteraction();
inactivityHandler.removeMessages(MESSAGE_WHAT, MESSAGE_TOKEN);
inactivityHandler.sendMessageDelayed(inactivityHandler.obtainMessage(MESSAGE_WHAT, MESSAGE_TOKEN), DELAY_TIME);
}
对于好奇的人,这是我的showLock 方法:
public void showLock() {
Intent intent = new Intent(this, LockActivity.class);
startActivity(intent);
}
【问题讨论】:
标签: java android android-activity android-context