【问题标题】:Open application after clicking on Notification点击通知后打开应用程序
【发布时间】:2012-11-22 21:28:15
【问题描述】:

我的应用中有一条通知,其中包含以下代码:

//Notification Start

   notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

   int icon = R.drawable.n1; 
   CharSequence tickerText = "Call Blocker";
   long when = System.currentTimeMillis(); //now
   Notification notification = new Notification(icon, tickerText, when);
   Intent notificationIntent = new Intent(context, Main.class);
   PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

   Context context = getApplicationContext();
   CharSequence title = "Call Blocker";
   text = "Calls will be blocked while driving";

   notification.setLatestEventInfo(context, title, text, contentIntent);

   notification.flags |= Notification.FLAG_ONGOING_EVENT;
   notification.flags |= Notification.FLAG_SHOW_LIGHTS;
   notificationManager.notify(1, notification);

}

我的通知触发得很好,但我的问题是,当我在通知中心点击通知时,它并没有启动我的应用程序。

基本上,点击我的通知后,什么都没有发生! 我应该怎么做才能在单击我的通知后开始我的主要活动。 谢谢。

【问题讨论】:

  • 试试this
  • Notification notification = new Notification(icon, tickerText, when); 之前移动 Context context = getApplicationContext(); 也许你没有传递正确的上下文来启动 Activity
  • 4 年多前...从那天起你经历了多么漫长的旅程 :) 但 android 通知没有任何变化 ;)
  • @HamedGh 差不多 5 年前! :)))
  • @Reza_Rg 是 7 年前。我也有同样的问题!

标签: android notifications


【解决方案1】:

见下面的代码。我正在使用它,它正在打开我的 HomeActivity。

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

    Intent notificationIntent = new Intent(context, HomeActivity.class);

    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;
    notificationManager.notify(0, notification);

【讨论】:

  • 我错过了 FLAG_AUTO_CANCEL。谢谢!
  • Notiification(int, java.lang.CharSequence, long) 自这篇文章以来已被弃用,需要使用 NotificationCompat.Builder。
  • 无法解析方法notification.setLatestEventInfo
【解决方案2】:

这是使用 NotificationCompact.Builder 类的示例,该类是构建通知的最新版本。

private void startNotification() {
    Log.i("NextActivity", "startNotification");

 // Sets an ID for the notification
      int mNotificationId = 001;

    // Build Notification , setOngoing keeps the notification always in status bar
    NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(this)
                    .setSmallIcon(R.drawable.ldb)
                    .setContentTitle("Stop LDB")
                    .setContentText("Click to stop LDB")
                    .setOngoing(true);

    // Create pending intent, mention the Activity which needs to be 
    //triggered when user clicks on notification(StopScript.class in this case)

    PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
            new Intent(this, StopScript.class), PendingIntent.FLAG_UPDATE_CURRENT);


    mBuilder.setContentIntent(contentIntent);


    // Gets an instance of the NotificationManager service
   NotificationManager mNotificationManager =
            (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);


    // Builds the notification and issues it.
    mNotificationManager.notify(mNotificationId, mBuilder.build());


}

【讨论】:

  • 我到底做错了什么?我有这个代码,但是当我点击通知时它不起作用。
【解决方案3】:

看来你错过了这部分,

notification.contentIntent = pendingIntent;

尝试添加它,它应该可以工作。

【讨论】:

    【解决方案4】:

    请使用以下代码获取简单通知的完整示例,在此代码中您可以单击通知后打开应用程序,它将解决您的问题。

    public class AndroidNotifications extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            Button notificationButton = (Button) findViewById(R.id.notificationButton);
    
            notificationButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    Timer timer = new Timer();
                    timer.schedule(new TimerTask() {
                        @Override
                        public void run() {
                            // Notification Title and Message
                            Notification("Dipak Keshariya (Android Developer)",
                                    "This is Message from Dipak Keshariya (Android Developer)");
                        }
                    }, 0);
                }
            });
        }
    
        // Notification Function
        private void Notification(String notificationTitle,
                String notificationMessage) {
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            android.app.Notification notification = new android.app.Notification(
                    R.drawable.ic_launcher, "Message from Dipak Keshariya! (Android Developer)",
                    System.currentTimeMillis());
    
            Intent notificationIntent = new Intent(this, AndroidNotifications.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                    notificationIntent, 0);
    
            notification.setLatestEventInfo(AndroidNotifications.this,
                    notificationTitle, notificationMessage, pendingIntent);
            notificationManager.notify(10001, notification);
        }
    }
    

    更多信息请参见下面的链接。

    Simple Notification Example

    【讨论】:

      【解决方案5】:

      使用以下代码为打开的活动创建通知。这个对我有用。 For full code

       Intent myIntent = new Intent(context, DoSomething.class);
       PendingIntent pendingIntent = PendingIntent.getActivity(
              context, 
              0, 
              myIntent, 
              Intent.FLAG_ACTIVITY_NEW_TASK);
      
       myNotification = new NotificationCompat.Builder(context)
         .setContentTitle("Exercise of Notification!")
         .setContentText("Do Something...")
         .setTicker("Notification!")
         .setWhen(System.currentTimeMillis())
         .setContentIntent(pendingIntent)
         .setDefaults(Notification.DEFAULT_SOUND)
         .setAutoCancel(true)
         .setSmallIcon(R.drawable.ic_launcher)
         .build();
      
       notificationManager = 
         (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
       notificationManager.notify(MY_NOTIFICATION_ID, myNotification);
      

      【讨论】:

      • setAutoCancel(true) 是我要找的。​​span>
      【解决方案6】:
      public void addNotification()
      {
          NotificationCompat.Builder mBuilder=new NotificationCompat.Builder(MainActivity.this);
          mBuilder.setSmallIcon(R.drawable.email);
          mBuilder.setContentTitle("Notification Alert, Click Me!");
          mBuilder.setContentText("Hi,This notification for you let me check");
          Intent notificationIntent = new Intent(this,MainActivity.class);
          PendingIntent conPendingIntent = PendingIntent.getActivity(this,0,notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);
      
          mBuilder.setContentIntent(conPendingIntent);
      
          NotificationManager manager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
          manager.notify(0,mBuilder.build());
          Toast.makeText(MainActivity.this, "Notification", Toast.LENGTH_SHORT).show();
      
      }
      

      【讨论】:

      • 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      【解决方案7】:

      使用这个:

          Notification mBuilder =
                  new NotificationCompat.Builder(this)
                          .setSmallIcon(R.drawable.ic_music)
                          .setContentTitle(songName).build();
      
      
          mBuilder.contentIntent=  PendingIntent.getActivity(this, 0,
                  new Intent(this, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
      

      contentIntent 将在点击通知时处理打开活动

      【讨论】:

        【解决方案8】:

        感谢上面的帖子,这里是主要行 - 从较长的代码答案中提取 - 这是将通知与点击侦听器设置连接以打开某些应用程序活动所必需的。

        private Notification getNotification(String messageText) {
        
            Notification.Builder builder = new Notification.Builder(this);
            builder.setContentText(messageText);
            // ...
        
            Intent appActivityIntent = new Intent(this, SomeAppActivity.class);
        
            PendingIntent contentAppActivityIntent =
                    PendingIntent.getActivity(
                                    this,  // calling from Activity
                                    0,
                                    appActivityIntent,
                                    PendingIntent.FLAG_UPDATE_CURRENT);
        
            builder.setContentIntent(contentAppActivityIntent);
        
            return builder.build();
        }
        

        【讨论】:

          【解决方案9】:

          这是我接近的方式。

          public class AppFCMService extends FirebaseMessagingService {
          
              private final static String TAG = "FCM Message";
              String notify, requstId, Notification;
              PendingIntent pendingIntent;
          
              @Override
              public void onMessageReceived(RemoteMessage remoteMessage) {
                  Log.d(TAG, "From: " + remoteMessage.getFrom());
                  Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody());
                  //split string and getting order id from notification
                  String Str = remoteMessage.getNotification().getBody();
                  String[] tmp;
                  tmp = Str.split(" ");
                  String temp1 = tmp[0];
                  String temp2 = tmp[1];
                  String id = tmp[2];
                  notify = temp1 + " " + temp2;
                  requstId = id;
                  showNotification(remoteMessage.getNotification().getBody());
              }
          
              private void showNotification(String messageBody) {
                  // check whether session has been initiated or not
                  if (new SessionHelper(getApplicationContext()).isLoggedIn()) {
          
                      if (notify.equalsIgnoreCase("Travel request")) {
          
                          Intent intent = new Intent(this, ViewTravelDetailsActivity.class);
                          intent.putExtra("TravelRequestID", requstId);
                          intent.putExtra("BackPress", "Notify");
                          pendingIntent = PendingIntent.getActivity(this, 0, intent,
                                  PendingIntent.FLAG_ONE_SHOT);
          
                      } else if (notify.equalsIgnoreCase("Timesheet replied")) {
          
                          Intent intent = new Intent(this, ViewReplyActivity.class);
                          intent.putExtra("timesheetActivityID", requstId);
                          intent.putExtra("BackPress", "Notify");
                          intent.putExtra("RealmData", "DeleteRealm");
                          intent.putExtra("isToday", "true");
                          pendingIntent = PendingIntent.getActivity(this, 0, intent,
                                  PendingIntent.FLAG_ONE_SHOT);
                      } else {
          
                          Intent intent = new Intent(this, Dashboard.class);
                          intent.putExtra("timesheetActivityID", requstId);
                          pendingIntent = PendingIntent.getActivity(this, 0, intent,
                                  PendingIntent.FLAG_ONE_SHOT);
                      }
                  } else {
          
                      Intent intent = new Intent(this, LoginActivity.class);
                      intent.putExtra("timesheetActivityID", requstId);
                      pendingIntent = PendingIntent.getActivity(this, 0, intent,
                              PendingIntent.FLAG_ONE_SHOT);
                  }
          
                  Bitmap notifyImage = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
                  Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
                  NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                          .setSmallIcon(R.mipmap.ic_launcher)
                          .setLargeIcon(notifyImage)
                          .setColor(Color.parseColor("#FFE74C3C"))
                          .setContentTitle("TEST")
                          .setContentText(messageBody)
                          .setAutoCancel(true)
                          .setSound(defaultSoundUri)
                          .setContentIntent(pendingIntent);
                  NotificationManager notificationManager =
                          (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                  notificationManager.notify(0, notificationBuilder.build());
              }
          }
          

          【讨论】:

            【解决方案10】:
            public static void notifyUser(Activity activity, String header,
                    String message) {
                NotificationManager notificationManager = (NotificationManager) activity
                        .getSystemService(Activity.NOTIFICATION_SERVICE);
                Intent notificationIntent = new Intent(
                        activity.getApplicationContext(), YourActivityToLaunch.class);
                TaskStackBuilder stackBuilder = TaskStackBuilder.create(activity);
                stackBuilder.addParentStack(YourActivityToLaunch.class);
                stackBuilder.addNextIntent(notificationIntent);
                PendingIntent pIntent = stackBuilder.getPendingIntent(0,
                        PendingIntent.FLAG_UPDATE_CURRENT);
                Notification notification = new Notification.Builder(activity)
                        .setContentTitle(header)
                        .setContentText(message)
                        .setDefaults(
                                Notification.DEFAULT_SOUND
                                        | Notification.DEFAULT_VIBRATE)
                        .setContentIntent(pIntent).setAutoCancel(true)
                        .setSmallIcon(drawable.notification_icon).build();
                notificationManager.notify(2, notification);
            }
            

            【讨论】:

              【解决方案11】:

              android 12 及以上的通知代码:

              如果您的应用面向 Android 12,则必须指定应用创建的每个 PendingIntent 对象的可变性。这一额外要求提高了您应用的安全性。

              在 ANDROID 12 之前

              PendingIntent contentIntent = PendingIntent.getActivity(context, (int) System.currentTimeMillis(), notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
              

              对于安卓 12:

              PendingIntent contentIntent = PendingIntent.getActivity(context, (int) System.currentTimeMillis(), notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
              

              先创建频道:

               @RequiresApi(api = Build.VERSION_CODES.O)
              private synchronized String createChannel() {
                  NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
              
                  String name = "dummy text for channel";
                  int importance = NotificationManager.IMPORTANCE_LOW;
              
                  NotificationChannel mChannel = new NotificationChannel("channel name, name, importance);
                  mChannel.setShowBadge(false);
                  mChannel.enableLights(true);
                  mChannel.setLightColor(Color.BLUE);
                  if (mNotificationManager != null) {
                      mNotificationManager.createNotificationChannel(mChannel);
                  } else {
                      stopSelf();
                  }
                  return "Channel";
              }
              

              通知示例:

              String channel="";
              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
                          channel = createChannel();
                      else {
                          channel = "";
                      }
              
                  RemoteViews mContentView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.general_notification_layout_new);
              
                  NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
                  NotificationCompat.Builder builder = new NotificationCompat.Builder(context, channel);
                  Intent notificationIntent = new Intent(getApplicationContext(), MainActivity.class);
                  notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                  notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
              
                  PendingIntent contentIntent = PendingIntent.getActivity(context, (int) System.currentTimeMillis(), notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
              
                  builder.setSmallIcon(R.drawable.notification_small_icon_one)
                          .setPriority(NotificationCompat.PRIORITY_HIGH)
                          .setSound(notificationSound)
                          .setColor(ContextCompat.getColor(this, R.color.colorPrimary))
                          .setCustomContentView(mContentView)
                          .setCustomBigContentView(mContentView)
                          .setContentIntent(contentIntent);
              
              
                  builder.setAutoCancel(true);
              
                  Notification notification = builder.build();
                  mNotificationManager.notify(notificationId, notification);
              

              【讨论】:

                【解决方案12】:

                用我的例子……

                 public void createNotification() {
                        NotificationManager notificationManager = (NotificationManager) 
                              getSystemService(NOTIFICATION_SERVICE);
                        Notification notification = new Notification(R.drawable.icon,
                            "message", System.currentTimeMillis());
                        // Hide the notification after its selected
                        notification.flags |= Notification.FLAG_AUTO_CANCEL;
                        Vibrator vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
                        long[] pattern = { 0, 100, 600, 100, 700};
                        vibrator.vibrate(pattern, -1);
                     Intent intent = new Intent(this, Main.class);
                     PendingIntent activity = PendingIntent.getActivity(this, 0, intent, 0);
                     String sms = getSharedPreferences("SMSPREF", MODE_PRIVATE).getString("incoming", "EMPTY");
                        notification.setLatestEventInfo(this, "message" ,
                            sms, activity);
                        notification.number += 1;
                        notificationManager.notify(0, notification);
                
                      }
                

                【讨论】:

                  猜你喜欢
                  • 2020-09-11
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-01-22
                  • 2014-12-22
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多