在将我引用到此论坛上的其他主题并将我的问题标记为重复之前,请仔细阅读我的问题。我必须创建一个全局应用程序超时。无论用户使用哪个活动,在特定时间量之后,用户将显示其会话已过期的AlertDialog并且他可以退出或更新其会话。我已经阅读了不同的解决方案,并将服务作为我的解决方案。
public class InActivityTimer extends Service {
MyCounter timer;
@Override
public void onCreate() {
timer = new MyCounter(20 * 1000,1000);
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
timer.start();
return super.onStartCommand(intent, flags, startId);
}
private class MyCounter extends CountDownTimer{
public MyCounter(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onFinish() {
Intent intent = new Intent("timeout_action");
sendBroadcast(intent);
stopSelf();
}
@Override
public void onTick(long millisUntilFinished) {
// Need AlertDialog code here
Toast.makeText(getApplicationContext(), ("Time Remaining: " + millisUntilFinished/1000)+"", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onDestroy() {
timer.cancel();
super.onDestroy();
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
}
问题是我可以毫无问题地显示Toast,但在onFinish()内部调用时不会显示AlertDialog。
第一个问题是为整个应用程序显示AlertDialog,记住为某些上下文显示AlertDialog。此外,如果以某种方式显示AlertDialog,那么如何关闭应用程序。在Activity上我只是通过调用finish()来关闭活动,所以在这种情况下我应该清除活动堆栈吗?
我面临的第二个复杂部分是当用户点击"剩余时间"时显示弹出窗口。应用程序中的链接将显示会话超时的剩余时间。此时间应与服务中剩余的时间完全相同。
我还可以使用BroadcastReceiver并在时间结束后向活动发送更新但不会是特定于Activity的,因为我希望无论用户使用哪个活动,超时都会相同。我想避免在每个活动上编写相同的代码。
请指导我解决一些问题。
答案 0 :(得分:1)
如果您为应用程序使用基于片段的设计,则可以保留根FragmentActivity,其中显示应用程序的所有其他元素。这样,您每次都可以使用根FragmentActivity的上下文来显示您的对话框。
补充:"你能不能给我一些文章......"
你正在做的事情并不常见,我必须谷歌搜索就像你找到任何类似于你的案例的现有例子。但是,我可以在上面提到的内容中填写更多细节。
如果您不熟悉使用碎片,请阅读Developer Documentation。
public class MainActivity extends FragmentActivity {
private static final int SPLASH_SCREEN_FRAGMENT = 0;
private static final int HOME_SCREEN_FRAGMENT = 1;
...
@Override
protected void onCreate(Bundle. savedInstanceState) {
super.onCreate(savedInstanceState);
// show your first fragment
Fragment splashFragment = new SplashFragment();
getSupportFragmentManager().beginTransaction().replace(android.R.id.content, splashFragment).commit();
// Start your service using the context of your FragmentActivity
// Your FragmentActivity will always be the current activity, and you will display
// all other elements of your app inside it as fragments
Intent intent = new Intent(this, InActivityTimer.class);
startService(intent);
}
// method for switching the displayed fragment
private void fragmentSwitcher(int fragmentType) {
Fragment currentFragment = new Fragment();
switch (currentFragmentType) {
case SPLASH_SCREEN_FRAGMENT:
currentFragment = new SplashScreenFragment();
break;
case HOME_SCREEN_FRAGMENT:
currentFragment = new HomeScreenFragment();
break;
...
}
getSupportFragmentManager().beginTransaction().replace(android.R.id.content, currentFragment).commit();
}
}
答案 1 :(得分:0)
我用相当简单的方法解决了我的问题。
@Override
public void onFinish() {
Intent intent = new Intent(getBaseContext(), TimeoutActivity.class);
startActivity(intent);
stopSelf();
}
及以下是我的TimeoutActivity的onCreate方法。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ContextThemeWrapper ctw = new ContextThemeWrapper(TimeoutDialogActivity.this, R.style.Theme_Base_AppCompat_Dialog_FixedSize);
final AlertDialog alertDialog = new AlertDialog.Builder(ctw).create();
alertDialog.setCancelable(false);
alertDialog.setTitle("Session Timeout !");
alertDialog.setTitle("Your session has expired.");
alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "Logout", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
alertDialog.dismiss();
finish();
}
});
alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "Exit", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
alertDialog.dismiss();
finish();
}
});
alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "Renew Session", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
alertDialog.dismiss();
finish();
});
alertDialog.show();
}