使用AlertDialog在特定时间之后的会话超时

时间:2014-07-07 23:32:35

标签: android

在将我引用到此论坛上的其他主题并将我的问题标记为重复之前,请仔细阅读我的问题。我必须创建一个全局应用程序超时。无论用户使用哪个活动,在特定时间量之后,用户将显示其会话已过期的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的,因为我希望无论用户使用哪个活动,超时都会相同。我想避免在每个活动上编写相同的代码。

请指导我解决一些问题。

2 个答案:

答案 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();
}