2012-01-23 26 views
13

Tôi muốn phát hiện khi nào ứng dụng của tôi được gửi tới nền. Có rất nhiều câu hỏi về việc móc khóa HOME - tôi hiểu điều này chỉ có thể bằng cách đăng ký làm ứng dụng trình chạy.Tự động đăng xuất Android khi ứng dụng chuyển sang nền

... NHƯNG ... vì luôn có khách hàng muốn có hành vi nhất định ...

Chúng tôi có một ứng dụng có yêu cầu bảo mật cao. Khách hàng muốn ứng dụng đăng xuất khỏi máy chủ bất cứ khi nào ứng dụng chạy vào nền vì bất kỳ lý do gì (gọi điện thoại, khóa HOME, quay lại hoạt động cuối cùng) (* * để làm rõ ý tôi là khi Hoạt động trước trên màn hình không phải là một trong các hoạt động của ứng dụng của tôi * *).

Vì vậy, nếu tôi không thể móc phím HOME, có các tùy chọn nào khác không? Rõ ràng chỉ cần hooking onPause() sẽ không hữu ích, bởi vì đó là Activity -specific.

Điều "tốt nhất" mà chúng tôi đã đưa ra là giữ một mảng tham chiếu Hoạt động trong lớp Ứng dụng của chúng tôi. Trong mỗi Hoạt động của onResume(), chúng tôi thêm nó vào mảng này. Trong onPause(), chúng tôi sẽ xóa nó. Cũng trong onPause() chúng tôi liệt kê thông qua mảng này để tìm hiểu xem có bất kỳ hoạt động nào đã đăng ký ở phía trước hay không. Nếu không tìm thấy hoạt động tiền cảnh, người dùng sẽ bị đăng xuất.

Tôi không hài lòng với điều này như một giải pháp và hy vọng tìm được cách tốt hơn.

Trả lời

5

Chúng tôi eneded lên sẽ cho một cái gì đó dựa trên giải pháp ở đây bởi @peceps: Run code when Android app is closed/sent to background.

+1

Tôi vừa thêm một bình luận mới cho chủ đề này, nơi tôi cho thấy một phương pháp tốt hơn (theo ý kiến ​​của tôi) bằng cách sử dụng Application.ActivityLifecycleCallbacks cũng như phương thức @peceps. Xem câu trả lời của tôi cho chủ đề: http://stackoverflow.com/a/13996042/327386 – RPM

+0

+1 giải pháp tuyệt vời cho API 14+ –

0

Hoặc bạn có thể sử dụng Đối tượng được chia sẻ là một singleton và tạo một đơn onPause()onResume() sẽ nhận/đặt dữ liệu trên đối tượng được chia sẻ đó. Các chức năng đó sẽ được sử dụng trong mọi hoạt động ' và onResume.

0

Điều này sẽ giúp:

phương pháp sa này được tìm thấy trong lớp Hoạt động

protected void onUserLeaveHint() 

    Since: API Level 3 
    Called as part of the activity lifecycle when an activity is about to go into the background as the result of user choice. For example, when the user presses the Home key, onUserLeaveHint() will be called, but when an incoming phone call causes the in-call Activity to be automatically brought to the foreground, onUserLeaveHint() will not be called on the activity being interrupted. In cases when it is invoked, this method is called right before the activity's onPause() callback. 
    This callback and onUserInteraction() are intended to help activities manage status bar notifications intelligently; specifically, for helping activities determine the proper time to cancel a notfication. 
+1

Anh ấy chỉ ra rằng các phương thức hoạt động sẽ không hoạt động vì anh ấy sử dụng nhiều hoạt động. Nó không thực sự quan trọng nếu bạn sử dụng onPause hoặc onUserLeaveHint. Sự khác biệt thực sự duy nhất là thứ hai bị sa thải trong những trường hợp ít hơn lần đầu tiên. – dtech

1

tôi đã làm việc trước để giải quyết cùng một vấn đề nhưng không có cách nào để làm điều đó như tôi biết trừ theo cách của bạn sử dụng hiện nay . và phương pháp ghi đè tốt nhất để bắt trạng thái hiển thị của hoạt động là onStart(), onStop() phương pháp này nắm bắt được sự thay đổi hiển thị thực tế và đếm số lượng hoạt động của bạn đếm để đăng xuất.

0

Tôi không biết nếu đi của mình để giúp bạn ra ngoài nhưng tôi sẽ cố gắng theo cách này

  1. Tạo một cơ sở Activity và ghi đè phương pháp onStop() nó thoát ra từ máy chủ
  2. Tất cả Activities của ứng dụng của tôi sẽ mở rộng trên lớp cơ sở.

Vì vậy, bây giờ những gì sẽ xảy ra nếu trên bất kỳ Hoạt động đi trong tình trạng onStop nó sẽ đăng xuất từ ​​máy chủ không có vấn đề như thế nào Hoạt động đi vào nền

Lưu ý: Nhưng nếu bạn từ mã của bạn dừng lại bất kỳ Hoạt động bằng cách gọi kết thúc sau đó cũng sẽ đăng xuất, do đó bạn phải làm việc ra trong kịch bản đó

+0

thx - Tôi hiểu vòng đời của các hoạt động Android - vấn đề đang cố gắng tìm ra cách để làm việc xung quanh vòng đời ứng dụng và quyết định của nhà thiết kế Android không cho phép ứng dụng móc nút HOME. Logic bạn đề cập trong ghi chú của bạn là chính xác những gì tôi đang cố gắng giải quyết bằng cách đặt câu hỏi. Tôi đang tìm kiếm một cách thanh lịch để làm điều đó. –

+0

không có vấn đề gì trong đó tạo ra một phương thức trong BaseActivity của bạn mà đặt boolean đúng khi bạn kết thúc Hoạt động và kiểm tra giá trị boolean trong onStop của BaseActivity tùy thuộc vào giá trị logout hoặc viceversa – ingsaurabh

6

// dịch vụ sử dụng

// trong đó

@Override 
    public void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 

     IntentFilter filter = new IntentFilter(); 
    filter.addAction(Intent.ACTION_SCREEN_OFF); 
    filter.addAction(Intent.ACTION_CALL); 
    filter.addAction(Intent.ACTION_ANSWER); 

    registerReceiver(mIntentReceiver, filter); 

}

// sau đó trong BroadcastReceiver

private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 

      if(action.equalsIgnoreCase("android.intent.category.HOME")) 
      { 
//logout logic 
} 
else if(action.equalsIgnoreCase("android.intent.action.SCREEN_OFF")) 
      { 
//logout logic 
} 

else if(action.equalsIgnoreCase("android.intent.action.DIAL")) 
      { 
//logout logic 
} 
else if(action.equalsIgnoreCase("android.intent.action.CALL")){ 
/ /logout logic 
} 
} 
+0

Tôi thích suy nghĩ ở đây, nhưng có các cách khác để hoạt động đi vào nền - ví dụ một hoạt động khác tự đưa mình lên phía trước. –

3

Tôi đã xử lý nó bằng cách lưu dấu thời gian khi hoạt động của tôi đóng \ tạm dừng. Khi một hoạt động khác bắt đầu, nó đọc dấu thời gian và nếu nó thay đổi nhiều hơn x giây, tôi thực hiện đăng xuất.

Nếu bạn cần thể chất thực hiện đăng xuất (tức là trên máy chủ từ xa), hãy thiết lập AlarmManager khi hoạt động tạm dừng để đăng xuất x giây trong tương lai. Bạn có thể hủy Báo thức này nếu hoạt động khác bắt đầu trước khi hoạt động đó phát sinh.

+0

Ý tưởng thêm một TimeStamp trong các hoạt động của bạn thật tuyệt vời! –

0

android:clearTaskOnLaunch có thể hữu ích. Nó không đăng xuất bạn khi bạn đi tới nền, nhưng bạn có thể buộc màn hình đăng nhập trở thành màn hình đầu tiên khi bạn quay trở lại.

Các vấn đề liên quan