17

GCMによってトリガーされるAndroidアプリでプッシュ通知を行っています。アプリがアラートボックスで実行されている場合に通知を表示したいのですが、アプリが実行されていない場合は、ステータスバーの通知を表示するだけです。アプリが実行されており、フォアグラウンドにあるかどうかをどのように判断しますか?これは、このような通知を表示することができます。現在、ステータスバーのプッシュ通知を表示するためにこのコードを使用しています

  NotificationManager notificationManager = (NotificationManager)
                context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notification = new Notification(icon, message, when);

        String title = context.getString(R.string.app_name);

         Intent notificationIntent = new Intent(context, BottomActivity.class);
        // set intent so it does not start a new activity
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
        notification.setLatestEventInfo(context, title, message, intent);
        notification.flags |= Notification.FLAG_AUTO_CANCEL;

        // Play default notification sound
        notification.defaults |= Notification.DEFAULT_SOUND;

        //notification.sound = Uri.parse("android.resource://" + context.getPackageName() + "your_sound_file_name.mp3");

        // Vibrate if vibrate is enabled
        notification.defaults |= Notification.DEFAULT_VIBRATE;
        notificationManager.notify(0, notification); 
4

3 に答える 3

3

ダイアログとして新しいアクティビティとテーマを作成し、フォアグラウンド アクティビティを確認できます。以下のコードを確認してください。

         ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningTaskInfo> services = activityManager
                .getRunningTasks(Integer.MAX_VALUE);
        boolean isActivityFound = false;

        if (services.get(0).topActivity.getPackageName().toString()
                .equalsIgnoreCase(context.getPackageName().toString())) {
            isActivityFound = true;
        }

       if (isActivityFound) {
            resultIntent = new Intent(context, AlertDialogNotification.class);
            resultIntent.putExtra(EXTRA_ALERT_MESSAGE_BEAUTIFUL, "anyMessage");
            resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(resultIntent); 
        }

マニフェストで、テーマをアクティビティのダイアログとして作成します。それが役に立てば幸い。問題がある場合はお知らせください。

于 2014-04-24T18:21:33.237 に答える
1

活動はどのくらいありますか?1 つだけの場合、onResume() と onPause() (アクティブな場合は別名) の間でシングルトン参照を保持し、アクティブな場合はレシーバーからアクティビティを呼び出すのは非常に簡単です。多くのアクティビティがある場合は、それらに共通の基本クラスを用意することで、同様のロジックを実現できます。このようなもの:

class MyActivity: Activity
{
    static private MyActivity _Current = null;

    protected void onResume() //Activated
    {
        super.onResume();
        _Current = this;
    }

    protected void onPause() //Deactivated
    {
        super.onPause();
        _Current = null;
    }

    //This is for the receiver to call
    static public PopAlert()
    {
        if(_Current != null)
        {
            new AlertDialog.Builder(_Current)
                .setMessage("Hello world")
                //More alert setup; use _Current as a context object
                .create().show();
        }
    } 
}
于 2013-03-22T16:26:34.073 に答える
0

これらを試してください

public static boolean isAppIsInBackground(Context context) {

        boolean isInBackground = true;
        ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) {
            List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses();
            for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
                if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                    for (String activeProcess : processInfo.pkgList) {
                        if (activeProcess.equals(context.getPackageName()))
                            isInBackground = false;
                    }
                }
            }
        } else {
            List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
            ComponentName componentInfo = taskInfo.get(0).topActivity;
            if (componentInfo.getPackageName().equals(context.getPackageName())) {
                isInBackground = false;
            }
        }
于 2017-04-12T06:58:34.447 に答える