简体   繁体   English

单击GCM通知时打开活动

[英]Open activity when GCM notification was clicked

I'm making a gcm application, and now I can receive the notification 我正在申请gcm,现在我可以收到通知了

But when I click the notification, it just open the app. 但是,当我单击通知时,它只是打开了应用程序。

I need to open another activity instead of Mainactivity 我需要打开另一个活动而不是Mainactivity

is there any way to do this? 有什么办法吗?

final Intent intent = new Intent(context, YourActivity.class);
intent.putExtra("key", "value");
final PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
final NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.set...;
final NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICATION_ID, builder.build());

Please read this for detail about creating a Notification http://developer.android.com/guide/topics/ui/notifiers/notifications.html . 请阅读此内容,以获取有关创建通知的详细信息http://developer.android.com/guide/topics/ui/notifiers/notifications.html
Depend on http://developer.android.com/guide/topics/ui/notifiers/notifications.html#NotificationResponse , there are two general situations of starting Activity from your notification – Regular activity and Special activity. 取决于http://developer.android.com/guide/topics/ui/notifiers/notifications.html#NotificationResponse ,从通知中启动Activity有两种一般情况-常规活动和特殊活动。
Methods below are the example of start 2 type of Activity: 下面的方法是Activity的开始2类型的示例:

Regular activity 定期活动

    private static final int NOTIFICATION_ID = 602;
    private static final int REQUEST_CODE_START_ACTIVITY = 610;
    /**
     * Create and show a simple notification containing the received GCM message.
     */
    private void sendNotification(String title, String message, Intent intent) {
        // Create a start PendingIntent
        PendingIntent resultPendingIntent = null;
        ComponentName componentName = intent.getComponent();
        if (componentName != null) {
            // The stack builder object will contain an artificial back
            // stack for the started Activity.
            // This ensures that navigating backward from the Activity leads out of
            // your application to the Home screen.
            TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
            // Adds the back stack for the Intent (but not the Intent itself) <== This comment must be wrong!
            stackBuilder.addParentStack(componentName);
            // Adds the Intent that starts the Activity to the top of the stack
            stackBuilder.addNextIntent(intent);

            resultPendingIntent = stackBuilder.getPendingIntent(REQUEST_CODE_START_ACTIVITY, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT);
        } else {
            resultPendingIntent = PendingIntent.getActivity(this, REQUEST_CODE_START_ACTIVITY, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT);
        }


        // Notification properties
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_stat_ic_notification)
                .setContentTitle(title)
                .setContentText(message)
                .setAutoCancel(true)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                .setDefaults(NotificationCompat.DEFAULT_ALL)
                .setContentIntent(resultPendingIntent);

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

        notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());

    }

Usage : 用法:

    Intent intent = new Intent(this, SignInActivity_.class);
    sendNotification(TextUtils.isEmpty(title) ? getString(R.string.app_name) : title, message, intent);

The manifest XML should look like this 清单XML应该如下所示

<activity
    android:name=".MainActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity
    android:name=".SignInActivity_"
    android:parentActivityName=".MainActivity">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity"/>
</activity>

Special activity 特别活动

    private static final int NOTIFICATION_ID = 602;
    private static final int REQUEST_CODE_START_ACTIVITY = 610;
    /**
     * Create and show a simple notification containing the received GCM message.
     */
    private void sendNotification(String title, String message, Intent intent) {
        // Create a start PendingIntent
        PendingIntent resultPendingIntent = PendingIntent.getActivity(this, REQUEST_CODE_START_ACTIVITY, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT);

        // Notification properties
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_stat_ic_notification)
                .setContentTitle(title)
                .setContentText(message)
                .setAutoCancel(true)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                .setDefaults(NotificationCompat.DEFAULT_ALL)
                .setContentIntent(resultPendingIntent);

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

        notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());

    }

Note: Because I use setDefaults(DEFAULT_ALL) , the vibrate permission is require <uses-permission android:name="android.permission.VIBRATE" /> 注意:因为我使用setDefaults(DEFAULT_ALL) ,所以振动许可需要<uses-permission android:name="android.permission.VIBRATE" />

Yes, it's possible. 是的,有可能。 You must set the "exported" flag of the activity in the manifest.xml to true. 您必须在manifest.xml中将活动的“已导出”标志设置为true。

Hope it helps. 希望能帮助到你。

Use this: 用这个:

int icon = R.drawable.ic_launcher;
long when = System.currentTimeMillis();
NotificationManager nm=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
Intent intent=new Intent(context,YourActivity.class);
PendingIntent  pending=PendingIntent.getActivity(context, 0, intent, 0);
Notification notification;
    if (Build.VERSION.SDK_INT < 11) {
        notification = new Notification(icon, "Title", when);
        notification.setLatestEventInfo(
                context,
                "Title",
                "Text",
                pending);
    } else {
        notification = new Notification.Builder(context)
                .setContentTitle("Title")
                .setContentText(
                        "Text").setSmallIcon(R.drawable.ic_launcher)
                .setContentIntent(pending).setWhen(when).setAutoCancel(true)
                .build();
    }
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.defaults |= Notification.DEFAULT_SOUND;
nm.notify(0, notification);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM