1

この質問はstackoverflowにとって新しいものではないことはわかっていますが、まだ混乱しています。したがって、この質問を重複としてマークしないでください。これについて私を助けてください!

私の Android アプリには多くのアクティビティがあります。アプリがフォアグラウンドになったときに Web サービスを呼び出す必要があり、アプリがバックグラウンドに切り替わったときに別の Web サービスを呼び出す必要があります。

私の最初の調査結果は次のとおりです。

私の活動:

  protected void onPause() 
    {
        AppUtil.trackAppBackgroundStatus(this);
        super.onPause();
    }

    protected void onResume() 
    {
        super.onResume();
        AppUtil.trackAppForegroundStatus(this);
    }

私のユーティリティクラス:

public class AppUtil 
{
    public static void trackAppForegroundStatus(Context theContext)
    {
        SharedPreferences aSharedSettings = theContext.getSharedPreferences("MyAppPreferences", Context.MODE_PRIVATE);
        String aAppStatus = aSharedSettings.getString("appStatus", "");

        if(!aAppStatus.equals("foreground"))
        {       
            SharedPreferences.Editor aPrefEditor = aSharedSettings.edit();
            aPrefEditor.putString("appStatus", "foreground");
            aPrefEditor.commit();

            trackSession(theContext, "foreground");
        }
    }

    public static void trackAppBackgroundStatus(Context theContext)
    {
        SharedPreferences aSharedSettings = theContext.getSharedPreferences("MyAppPreferences", Context.MODE_PRIVATE);
        String aAppStatus = aSharedSettings.getString("appStatus", "");

        if(!aAppStatus.equals("background"))
        {   
            SharedPreferences.Editor aPrefEditor = aSharedSettings.edit();
            aPrefEditor.putString("appStatus", "background");
            aPrefEditor.commit();

            trackSession(theContext, "background");
        }
    }
}

trackSession メソッドは、アプリのフォアグラウンドとバックグラウンドの状態を追跡します。

欠点: 上記のように、私のアプリにはさまざまなアクティビティがあります。したがって、Page_A と Page_B があるとします。

Page_A では、onCreate() メソッド呼び出しの後、制御が onResume() に移動し、アプリがフォアグラウンドにあることを追跡します。次のページ (Page_B) に移動すると、Page_A の onPause() メソッドが呼び出され、それを追跡します。アプリがバックグラウンドに切り替わります。

すべてのアクティビティでこれを追跡したくありません..アプリがバックグラウンドに移行した場合にのみ、アプリのバックグラウンド ステータスを追跡する必要があります (つまり、ユーザーがホーム ボタンを押してアプリがバックグラウンドに切り替えられた場合のみ)。

誰でも私を案内してください。基本的に、2 つの Web サービスを呼び出す必要があります。1 つはアプリがフォアグラウンドになったとき、もう 1 つはアプリがバックグラウンドに切り替わったときです。

アプリに関してこれらの呼び出しを行うことができない場合、上記のコードを更新してそれらを処理するにはどうすればよいですか。

助けてください。

4

3 に答える 3

0
@Override
protected void onUserLeaveHint() {
    // TODO Auto-generated method stub
    super.onUserLeaveHint();
    // application is on background
}

Acitivity.onUserLeaveHint() のドキュメントでは、以下を見つけることができます

ユーザーの選択の結果、アクティビティがバックグラウンドに移行しようとしているときに、アクティビティ ライフサイクルの一部として呼び出されます。たとえば、ユーザーがホーム キーを押すと onUserLeaveHint() が呼び出されますが、電話の着信によって通話中のアクティビティが自動的に前面に表示されると、中断されたアクティビティで onUserLeaveHint() は呼び出されません。 . 呼び出される場合、このメソッドはアクティビティの onPause() コールバックの直前に呼び出されます。

于 2013-03-12T13:28:07.107 に答える
0

あなたが言ったように、

  • getRunningTasks() は私の問題を解決します。ただし、Google はおそらく ActivityManager.getRunningTasks() を使用するアプリを拒否することをお読みください。

しかし、ドキュメントを見てください

            ActivityManager activityManager = (ActivityManager) this.getSystemService( ACTIVITY_SERVICE );
        List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
        for(int i = 0; i < procInfos.size(); i++){
            if(procInfos.get(i).processName.equals("com.your.package.name")) {
//              procInfos.get(i).IMPORTANCE_FOREGROUND 
                Toast.makeText(getApplicationContext(), "your app is running", Toast.LENGTH_LONG).show();
            }
        }
于 2013-03-12T13:49:26.710 に答える
0

最小 API レベルが 14 の場合、Application.registerActivityLifecycleCallbacksメソッドはこのタスクを簡単に解決します。「onActivityPaused」および「onActivityResumed」メソッドでアクティブなアクティビティを数えるだけで、値をインクリメント/デクリメントできます。したがって、ゼロ以外の値は、アプリケーションがフォアグラウンドにあることを示します。

于 2014-10-24T08:46:30.010 に答える