2012-03-05 7 views
3

Androidには、アクティビティがonPauseを持つようなアプリケーションレベルのonPauseはありませんが、同様の機能が必要なようです。私は(愚かな)質問をしばらく前に聞いて(http://stackoverflow.com/questions/9508301/checking-the-manner-in-which-an-activity-has-been-reanimated)、onPause/onResumeが私が探しているもの:アクティビティが背景に降格されたかどうかを知る能力(ホームボタン、別のアプリケーションを開く、スリープ状態の電話など)。アプリケーションレベルonPause

問題は、私のアプリケーションの1つのアクティビティから別のアクティビティに移動するときに、アクティビティでonPauseも発生します。だから私は、ユーザーが自分のアプリでアクティビティからアクティビティに行くことができる(そして15から25のどこかにある)すべての単一の方法を見つけ出し、それぞれのユーザが開始したアクティビティスイッチの直前にフラグを設定する道を歩いている。それからonResumeで私はそのフラグをチェックしており、それがXならば、それはユーザが開始したonResumeであることを知っています。フラグがYの場合は、ホームボタンが押された、スリープ状態の電話などの結果であることがわかります)。

これはちょうど大きな汚れたkludgeのようです。より良い方法がありますか?

(これを助けて、混乱させないようにする:私の目標は、アプリが何らかの理由で(スクリーンスリープさえ)フォアグラウンドから離れたときにいつでもポップアップする(非常に厄介な、わかっている)私はonPause/onResumeを使用してPasscodeアクティビティをポップするときをチェックする予定でしたが、アクティビティを変更するたびにonPauseが発生するため、さらに追加する必要があります)

+0

ユーザーが戻るキーまたはホームキーを押したときにパスコードの動作を表示したいですか? –

+0

バックキーではありません。ちょうどホームキーでもない。私は、タイムアウトのためにアプリケーションがフォアグラウンドを離れたり画面が暗くなったりすると、いつでもパスコード画面がポップするようにしたい。私はonPause/onResumeがこのために働くと考えていましたが、それは1つのアクティビティ内で行いますが、onPauseはアクティビティからアクティビティに移動するときに発生するため、onPauseだけに依存することはできません。 – milkboneUnderwear

答えて

0

Pinnacle Lockerのようなアプリは、特定のパッケージのインテントを傍受してシステムがアプリに切り替わるたびに起動されますが、ユーザーがアプリの画面を変更するときは起動しません。

私はあなたを誤解しているかもしれませんが、別のアプローチはあなたのアプローチを回すことです:アプリケーション内であるスクリーンから別のスクリーンに変更するたびに、Intentを起動するか(finishユーザーは戻るボタンを押します)、そうですか?

次に、内部のIntentsにフラグを設定できます。また、finish()を直接呼び出すか、onBackPressed()が呼び出されたときにも同様のフラグを設定できます。アプリでonResume()が実行されているときにそのフラグが設定されていない場合は、ロック画面を表示できます。

+0

これは興味深いようです。ユーザーが別のアクティビティを開始する任意のポイントで、自分のすべてのアクティビティにフラグを設定する代わりに、インテントの変更を処理してそこにフラグを設定するグローバルクラスを作成できます。標準的なstartActivity(intent)を置き換えるために私のコードをどこでも更新しなければならないだろうが、それは私が取ろうとしているアプローチよりも少ないはずである。私はこれを掘り起こすだろうが、私は文脈の問題に遭遇するつもりだと心配している... – milkboneUnderwear

0

これは本当にあなたの質問には答えません。別のアプローチでは、フラグマネジメントを行うアクティビティベースクラスを作成し、それからすべてのアクティビティを継承できますか? 1つのアクティビティのonPauseと別のアクティビティのonResumeの間のタイムアウトを5秒に設定して、アプリ内スイッチではなくアウトオブアプリの切り替えを行うことを決定するような操作を行うこともできます。アクティビティの変更を開始するためにアクティビティベースクラスから呼び出すユーティリティ関数です。それでも、物事を追跡する必要がある場所の面積が大幅に縮小されます。

0

アプリケーションが表示されていない場合は、onPause()関数とアプリケーションの可視性ステータスを結合し、さらに処理する必要があります。次のコードは役に立ちます:

private boolean isVisible(String app) { 
     ActivityManager activityManager = (ActivityManager) getApplicationContext() 
       .getSystemService(Context.ACTIVITY_SERVICE); 
     List<RunningAppProcessInfo> appProcesses = activityManager 
       .getRunningAppProcesses(); 
     for (RunningAppProcessInfo appProcess : appProcesses) { 
      if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE) { 
       Log.i("Foreground App", appProcess.processName); 
       if (app.equalsIgnoreCase(appProcess.processName)) { 
        return true; 
       } 
      } 
     } 

     return false; 
    } 

これもまた現在のシナリオには完全には当てはまりません。

+0

これも良いようだ。私はそれにショットを与え、魔法の緑のチェックマークで私の問題のための最善の解決策を報いるためにここに戻ります。 – milkboneUnderwear

関連する問題