Android: 自动注销

Android: automatic logout

嗨,我想在确定的不活动时间后自动注销我的 Android 应用程序。 在 onPause 的第二个 Activity 中,我将应用程序暂停的时间保存在一个变量中。 在 MainActivity 方法 onresume 中,我将应用程序重新启动的时间保存在另一个变量中 并计算两个变量之间的差异。如果这个差异大于一个确定的时间, 例如 10 秒有注销。

我的主代码Activity:

public class MainActivity extends Activity {

    private EditText username,password;
    public static final String MyPREFERENCES = "MyPrefs" ;
    public static final String name = "nameKey"; 
    public static final String pass = "passwordKey"; 
    SharedPreferences sharedpreferences;

    public static Long t0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        username = (EditText)findViewById(R.id.editText1);
        password = (EditText)findViewById(R.id.editText2);

        username.setText("***");
        password.setText("***");

        t0 = Welcome.t0;
    }


    @Override
    protected void onResume() {
        sharedpreferences=getSharedPreferences(MyPREFERENCES, 
                Context.MODE_PRIVATE);
        if (sharedpreferences.contains(name))
        {
            if(sharedpreferences.contains(pass)){
                Intent i = new Intent(this,SecondActivity.class);
                startActivity(i);
            }

        Calendar c = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        String strDate = sdf.format(c.getTime());
        System.out.println(strDate);

        Date d;
        try {
            d = sdf.parse(strDate);
            long second2=d.getSeconds();

            long ts=Math.abs(second2-t0);

            if (ts>=10){

                logout();
                Intent i2 = new Intent(this,MainActivity.class);
                startActivity(i2);
                }

        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
        super.onResume();
    }

    public void login(View view){
        Editor editor = sharedpreferences.edit();
        String u = username.getText().toString();
        String p = password.getText().toString();
        if(u.equals("***") && p.equals("***")){

            editor.putString(name, u);
            editor.putString(pass, p);
            editor.commit();
            Intent i = new Intent(this,SecondActivity.Welcome.class);
            startActivity(i); 
        }
        else{
            Toast.makeText(MainActivity.this, "ko", Toast.LENGTH_SHORT).show();

        }
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


    public void onPause() {
        super.onPause();
        this.finish();
    }

    public void closing() {
        finish();
    }

    public void logout(){
        SharedPreferences sharedpreferences = getSharedPreferences
                (MainActivity.MyPREFERENCES, Context.MODE_PRIVATE);
        Editor editor = sharedpreferences.edit();

        editor.clear();
        editor.commit();
        moveTaskToBack(true); 
        this.finish();
    }

}

第二个Activity的代码是:

public class Second extends Activity {

    static Long t0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_welcome);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.welcome, menu);
        return true;
    }
    public void logout(View view){
        SharedPreferences sharedpreferences = getSharedPreferences
                (MainActivity.MyPREFERENCES, Context.MODE_PRIVATE);
        Editor editor = sharedpreferences.edit();

        editor.clear();
        editor.commit();
        moveTaskToBack(true); 
        this.finish();
    }

    public void exit(View view){

        moveTaskToBack(true); 
        this.finish();

    }

     public void onPause() {
     super.onPause();
            Calendar c = Calendar.getInstance();
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
            String strDate = sdf.format(c.getTime());


                            Date d;
                            try {
                                d = sdf.parse(strDate);
                                long second=d.getSeconds();

                                Welcome.t0=second;

                            } catch (ParseException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }

                            this.finish();

       }

        public void closing() {
            finish();
        }

}

这个方法不行,因为第一次没问题,第二次就不行了,就是没有注销。我该如何解决这个问题?

我建议您使用 countDownTimer,打开应用程序后立即启动。

new CountDownTimer(10000, 1000) {//CountDownTimer for 10 seconds

 public void onTick(long millisUntilFinished) {
     }

 public void onFinish() {
     //logout here.
SharedPreferences sharedpreferences = getSharedPreferences
            (MainActivity.MyPREFERENCES, Context.MODE_PRIVATE);
    Editor editor = sharedpreferences.edit();

    editor.clear();
    editor.commit();
    moveTaskToBack(true); 
    this.finish();
 }
}
.start();

设置闹钟:

Calendar cal = Calendar.getInstance();

cal.add(Calendar.MINUTE, "YourTimeinMinutes"); // you can use Calendar.Seconds etc according to your need

Intent intent = new Intent(YourActivity.this, AlarmReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(YourActivity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

// Get the AlarmManager service
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);

AlarmReceiver.class

public class AlarmReceiver extends BroadcastReceiver 
{
    @Override
    public void onReceive(Context context, Intent intent) 
    {   
        //your logic 
    }
}

不要忘记在您的应用程序标签内的清单中添加接收器:

  <receiver  android:name=".AlarmReceiver"  ></receiver>

在暂停时添加取消注册您的广播。