2013-04-08 20 views
1

我面臨的問題找到如何調用用戶定義的方法啓動(否則,只需登錄一個消息)時,應用程序變得活躍是來自於背景,即前臺,如果用戶按下home鍵當應用程序再次到達前臺時,該應用程序會轉到後臺我想顯示一個警告框。可以請某些人告訴我如何執行此檢查,以瞭解應用程序是否已到達前臺或提供某些鏈接。我不明白要搜索什麼對於。有些網站提到我可以覆蓋OnResume()。然而,即使我回到這個活動,每當我的活動從一個活動啓動到另一個時,都會調用此方法。我只需要在用戶從背景到前景時才調用此方法。如何識別活動從背景

回答

2

這是一個簡單的解決方案。

@Override 
    protected void onPause() 
    { 
     super.onPause(); 

     PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); 
     isScreenOn = powerManager.isScreenOn(); 
     OnPause = true; 

    } 

    @Override 
    protected void onResume() 
    { 
     super.onResume(); 
     OnResume = true;  
     if (!isScreenOn) 
      { 
       // your code; 
      } 
    } 

    @Override 
    protected void onStop() { 
     // TODO Auto-generated method stub 
     super.onStop(); 

     if(OnPause == true && OnResume == true && !isScreenOn) 
     { 
      YourActivity.this.finish(); 
     } 
     isScreenOn = false; 
     OnPause = false; 
     OnResume = false; 
    } 

這裏isScreenOn,在onPause,是的onResume布爾值。 當你的手機屏幕得到鎖定,那麼應用程序進去的onPause(),它檢查「isScreenON」,然後變爲「的onStop()」,其中isScreenOn設置爲false。

當你的活動都在前臺「的onResume」之稱。它檢查isScreenON,它絕對完美。直到他進入password.This應用程序將僅適用於單個用戶(設備ID特定的)使用.Couldü請告訴我如何寫一個方法/(該法)

+0

我想你的代碼,我已經在這裏添加了一個吐司消息(//你的代碼;)然而,當我第一次啓動到活動即使再敬酒消息是executed.This吐司應該,如果我只執行從背景到前景 – Joyson 2013-04-17 10:17:56

+0

boolean isScreenOn = true; public static boolean OnPause = false; public static boolean OnResume = false; 爲您的活動中的變量設置這些默認值。 – 2013-04-17 12:18:00

+0

嘿薩加爾日Thnx一噸這個作品很酷!但是我想實現這個多activities.Do我需要在所有類別中寫這個邏輯,我想使它這樣的全球性,每當我去後臺而來前景應該調用我的代碼的任何活動。 – Joyson 2013-04-19 09:41:15

0

我會建議使用超時密碼。因此,當用戶使用該應用程序時,密碼將在x分鐘內保持「正常」。

試想一下,如果有人在早上推出的應用程序,可以追溯到homemenu,並在您仍想先登錄用戶晚上再啓動它?

超時日期可以很容易地存儲在SharedPreferences。 (也請不要將密碼存儲在SharedPreferences純文本,但保存它的哈希值。

+0

是@ Rcdk.The用戶不能使用該應用程序如果您有解決方案,請確定該應用已進入活動狀態。 – Joyson 2013-04-08 09:32:39

1

解決方法很簡單

考慮四種方法的onCreate()的onResume,在onPause()的onSaveInstanceState(捆綁outState)。

你需要創建一個長的全局變量爲這項活動

現在目前的時間分配電流,這個變量中的onCreate(),如果你的Bundle savedInstanceState爲null,其他明智的savedInstanceState

還原值

在的onResume檢查當前時間之間的差異millsec System.currentTimeMillis();和這個全局變量,如果是大於說1秒(可根據您的需求會更高)顯示一個警告框詢問密碼

在的onPause()將System.currentTimeMillis();保存爲全局變量。

onSaveInstanceState(Bundle outState)存儲全局變量的值捆綁在的onCreate恢復()。

示例代碼

 import android.os.Bundle; 
     import android.widget.Toast; 
     import android.app.Activity; 


     public class MainActivity extends Activity { 

     long timeLastPause=0; 

      @Override 

      public void onCreate(Bundle savedInstanceState) 
      { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_main); 


       if(savedInstanceState==null) 
       { 
        timeLastPause=System.currentTimeMillis(); 
//Toast.makeText(this, "App created just now", Toast.LENGTH_LONG).show(); 
       } 
       else 
       { 
        timeLastPause= savedInstanceState.getLong("timeLastPause"); 

       } 





      } 

      @Override 
       protected void onResume() { 
        // TODO Auto-generated method stub 
        super.onResume(); 
        if((System.currentTimeMillis()-timeLastPause)>1000) 
        { 
         Toast.makeText(this, "the app becomes active that is comes to foreground from background", Toast.LENGTH_LONG).show(); 
        } 
       } 


      @Override 
       protected void onPause() { 
        // TODO Auto-generated method stub 
        super.onPause(); 
        timeLastPause=System.currentTimeMillis(); 

       } 


      @Override 
      protected void onSaveInstanceState(Bundle outState) { 
       // TODO Auto-generated method stub 
       super.onSaveInstanceState(outState); 
       outState.putLong("timeLastPause", timeLastPause); 
      } 


      } 

[編輯]

現在好了任意數量的活動[:-0這是棘手的,希望它會工作。我在一些項目中實現這一點,工作得很好]

清單中

<application 
     android:name=".TrickyApplication" 
     ... 
      > 

現在,在每一個活動onResume()

TrickyApplication app = ((TrickyApplication) this.getApplication()); 

if (System.currentTimeMillis() - app.lastPause > 1000) { 
    Toast.makeText(this, "Show Password Dlg Now", Toast.LENGTH_LONG).show(); 
      } 

創建TrickyApplication.java

public class TrickyApplication extends Application { 
    public long lastPause; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     lastPause = 0; 
    } 
} 

現在在每一個活動onPause()

((TrickyApplication) this.getApplication()).lastPause = System 
       .currentTimeMillis(); 

注意,密碼對話框會也顯示,第一次可以用一些共享偏好管理這一點,並沒有設置它,直到你的用戶不顯示對話框

之前設置一個密碼左右,然後再檢查縣
+0

我猜密碼部分是混淆了我的問題,所以我編輯的question.Please檢查 – Joyson 2013-04-08 09:57:34

+0

查看示例代碼我只是說 – 2013-04-08 10:12:10

+0

一個簡單的布爾也就夠了,你在OnCreate設置(這將只調用一次)。無需存儲時間等。 – RvdK 2013-04-08 10:22:58