18

通知が終了すると通知を開始するタイマーがあります。ただし、アプリが現在表示されていない場合にのみnotificationManagerを使用して通知を発行し、アプリがフォアグラウンドにあるときにタイマーが終了した場合はalertDialogを表示したいと思います。

私はすでにこれで試しました:

ActivityManager actMngr = (ActivityManager) ValeoMobileApplication.getContext().getSystemService(Activity.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> runningAppProcesses = actMngr.getRunningAppProcesses();
Tools.log("TimerBroadcastReceiver", "onReceive", "All running processes are listed below :");
for (RunningAppProcessInfo pi : runningAppProcesses) {
    //Check pi.processName and do your stuff
    //also check pi importance - check if process is in foreground or background
    Tools.log("TimerBroadcastReceiver", "onReceive", pi.processName + " importance = "+pi.importance);
    if(pi.processName.equalsIgnoreCase("MY_APP_PROCESS_NAME")){
        if (pi.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
            isApplicationInForeground = true;
        }
    }
}

しかし、アプリがフォアグラウンドであるかどうかは問題ではないようです。これどうやってするの?

4

4 に答える 4

26

ただし、アプリが現在表示されていない場合にのみnotificationManagerを使用して通知を発行し、アプリがフォアグラウンドにあるときにタイマーが終了した場合はalertDialogを表示したいと思います。

順序付けられたブロードキャストを使用します。アクティビティには、フォアグラウンドにある場合は優先度の高いレシーバーがあり、フォアグラウンドにない場合はマニフェスト登録されたレシーバーがあります。

これは、この手法の概要を説明するブログ投稿です。

UPDATE 2018-01-04:上記のアプローチは機能しますが、システムブロードキャストが含まれるため、ほとんどの(単一プロセス)アプリには適していません。代わりに、イベントバス(LocalBroadcastManager、greenrobotのEventBus)を使用して、パフォーマンスとセキュリティを向上させることができます。を使用するこのサンプルアプリと、このパターンを実装するgreenrobotのEventBusを使用するこのサンプルアプリをLocalBroadcastManager参照してください。

于 2011-07-27T16:19:37.070 に答える
11

次の方法で、アプリが表示されているかどうかを検出できます。

すべてのあなたのActivity、セット:

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

    myVisibilityManager.setIsVisible(true);
}

@Override
protected void onPause() {
    myVisibilityManager.setIsVisible(false);

    super.onPause();
}

(これにより、この動作を実装するすべてのアクティビティにスーパークラスを定義することができます)

次に、VisibilityManager(これは非常に基本的なものであり、より高度なものが必要になる場合があります)を作成します。

public class VisibilityManager {
    private boolean mIsVisible = false;

    public void setIsVisible(boolean visible) { 
         mIsVisible = visible; 
    }

    public boolean getIsVisible() {
         return mIsVisible;
    }
}

そして、タイマースレッドで、カウントダウンがゼロに達したとき:

if (VisibilityManager.getIsVisible()) {
    showAlertDialog();
}
else {
    showNotification();
}

編集:しかし、私はこのページでここに説明されているCommonsWareのアプローチを好みます。よりエレガントです。

于 2011-07-27T16:35:22.060 に答える
0

この場合、アクティビティではなくサービスを使用することをお勧めします。

サービスはバックグラウンドで実行され、正しく開始されていればアクティビティのライフサイクルの影響を受けません。

覚えておくべき重要なことの1つは、UIに戻るときに、サービスがUIスレッドを明示的に呼び出す必要があることです。そうしないと、UIスレッドがスレッドセーフではないため、ANRエラーが発生します。

そのドキュメントを読んでください、それはあなたがやろうとしていることのためのより良い解決策を得るのを助けるはずです!

これがお役に立てば幸いです

于 2011-07-27T15:54:53.230 に答える
-1

解決策は次のとおりです。

public static boolean uygulamaCalisiyormu(Context context)
    {
        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> islemler = activityManager.getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo uygulamaIslemi : islemler)
        {
            if (uygulamaIslemi.processName.equals(context.getPackageName()))
            {
                if (uygulamaIslemi.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE || uygulamaIslemi.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND)
                {
                    return true;
                }
            }
        }
        return false;
    }


...
 if (uygulamaCalisiyormu(getApplicationContext()))
        {
            Log.d("asd","App Already Started");
        }
      else
        {
Log.d("asd","App Started");
}

編集:特定のアクティビティ(クラス)を確認したい場合は、これを使用してください。

  if (uygulamaIslemi.processName.equals("com.TRSoft.timetab:PIN"))
            {
                if (uygulamaIslemi.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE || uygulamaIslemi.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) // Lanet olasıca şey Visible ile Foreground arasındaki fark ne oç illaha ya da yı kullanarak olduğunu keşfetmem mi lazım!
                {
                    return true;
                }
            }

そしてあなたのマニフェストファイルで:

 <activity android:name=".PINSayfasi"
            android:process=":PIN"></activity>

したがって、主なロジックは、プロセスを開いて読み取ることです。

于 2016-06-04T10:35:59.660 に答える