【问题标题】:Display push notification in alert box when the app is running in the foreground当应用程序在前台运行时,在警报框中显示推送通知
【发布时间】:2013-03-12 12:37:59
【问题描述】:

我正在由 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); 

【问题讨论】:

  • 仅供参考,如果这是一个新项目,您应该使用 GCM 而不是 C2DM,因为它已被弃用,Google 说“C2DM 不会接受新用户,并且不会授予新配额”
  • 好的,谢谢,我将使用 GCM 并编辑我的问题
  • 看看这个。简单的解决方案。 link

标签: android push-notification google-cloud-messaging


【解决方案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();
        }
    } 
}

【讨论】:

    【解决方案2】:

    您可以创建一个新的 Activity 和主题作为 Dialog 并检查前台活动。检查以下代码。

             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); 
            }
    

    在清单中将主题设置为活动的对话框。希望能帮助到你。让我们知道您是否有问题。

    【讨论】:

      【解决方案3】:

      请试试这些

      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;
                  }
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-15
        • 1970-01-01
        相关资源
        最近更新 更多