单击通知后打开应用程序

我的应用程序中有一个通知,代码如下:

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


}

我的通知功能非常好,但我的问题是,当我在通知中心点击通知时,它不会启动我的应用程序。

基本上,点击我的通知后什么都没有发生! 我应该做什么,以启动我的主要活动后,点击我的通知。 谢谢。

274095 次浏览

看来你错过了这部分,

notification.contentIntent = pendingIntent;

尝试添加这个,它应该工作。

见下面的代码。我正在使用它,它是打开我的家庭活动。

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

用我的例子。

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


}

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

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

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

简单通知示例

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

下面是使用 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());




}

使用:

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

ContentInent 将在通知单击时负责打开活动

使用下面的代码为打开的活动创建通知。 完整代码

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

这就是我接近的方式。

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

多亏了上面的帖子,这里有一些主线 -从更长的代码答案中提炼出来的-它们是连接通知和点击监听设置来打开一些应用程序活动所必需的。

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


}

Android 12及以上版本的通知代码:

如果你的应用针对的是 Android 12,你必须指定应用创建的每个 PendingInent 对象的可变性。这个附加要求提高了应用程序的安全性。

在安卓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);

Android 12 notifications