Thậm chí bạn có thể quản lý yêu cầu của bạn với @gfrigon hoặc @AKh giải pháp.
Nhưng đây là giải pháp miễn phí Timer and Handlers cho việc này. Tôi đã có giải pháp Timer được quản lý tốt cho việc này. Nhưng tôi đã triển khai thành công giải pháp miễn phí Timer và Handler.
Đầu tiên, tôi cho bạn biết bạn phải quản lý những gì nếu bạn sử dụng Bộ hẹn giờ hoặc Bộ xử lý.
- Nếu ứng dụng của bạn bị giết bởi người dùng hoặc bởi trình tối ưu hóa, ứng dụng của bạn sẽ không bao giờ tự động đăng xuất, vì tất cả các lệnh gọi lại của bạn đều bị hủy. ( Quản lý một số Trình quản lý báo động hoặc Dịch vụ? )
- Có tốt không để có bộ đếm thời gian trong mỗi lớp cơ sở? Bạn đang tạo nhiều luồng chỉ để gọi quy trình đăng xuất ( Quản lý Trình xử lý tĩnh hoặc Bộ hẹn giờ ở cấp ứng dụng? ).
- Điều gì xảy ra nếu người dùng đang ở chế độ nền, Trình xử lý của bạn sẽ bắt đầu Hoạt động đăng nhập nếu người dùng đang thực hiện một số công việc khác bên ngoài ứng dụng của bạn. ( Quản lý nền trước hay nền ứng dụng? ).
- Điều gì sẽ xảy ra nếu màn hình tự động tắt. ( Quản lý tắt màn hình trên bộ thu phát sóng? )
Cuối cùng, tôi đã triển khai một giải pháp là
- KHÔNG có Bộ xử lý hoặc Bộ hẹn giờ.
- Trình quản lý báo thức KHÔNG.
- KHÔNG quản lý Vòng đời ứng dụng.
- KHÔNG
ACTION_SCREEN_ON
/ Bộ ACTION_SCREEN_OFF
thu phát sóng.
Giải pháp đáng tin cậy dễ dàng nhất
Chúng tôi sẽ không quan sát sự không hoạt động của người dùng theo bộ hẹn giờ thay vì chúng tôi sẽ kiểm tra thời gian hoạt động cuối cùng về hoạt động của người dùng. Vì vậy, khi người dùng tương tác với ứng dụng lần sau, tôi sẽ kiểm tra thời gian tương tác cuối cùng.
Đây là BaseActivity.class
cái mà bạn sẽ mở rộng từ mọi lớp hoạt động của mình thay vì LoginActivity
. Bạn sẽ xác định thời gian đăng xuất của mình trong trường TIMEOUT_IN_MILLI
trong lớp này.
import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
public class BaseActivity extends AppCompatActivity {
public static final long TIMEOUT_IN_MILLI = 1000 * 20;
public static final String PREF_FILE = "App_Pref";
public static final String KEY_SP_LAST_INTERACTION_TIME = "KEY_SP_LAST_INTERACTION_TIME";
@Override
public void onUserInteraction() {
super.onUserInteraction();
if (isValidLogin())
getSharedPreference().edit().putLong(KEY_SP_LAST_INTERACTION_TIME, System.currentTimeMillis()).apply();
else logout();
}
public SharedPreferences getSharedPreference() {
return getSharedPreferences(PREF_FILE, MODE_PRIVATE);
}
public boolean isValidLogin() {
long last_edit_time = getSharedPreference().getLong(KEY_SP_LAST_INTERACTION_TIME, 0);
return last_edit_time == 0 || System.currentTimeMillis() - last_edit_time < TIMEOUT_IN_MILLI;
}
public void logout() {
Intent intent = new Intent(this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
Toast.makeText(this, "User logout due to inactivity", Toast.LENGTH_SHORT).show();
getSharedPreference().edit().remove(KEY_SP_LAST_INTERACTION_TIME).apply(); // make shared preference null.
}
}