Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何检测NotificationManager发送的通知的发件人/检测已单击通知栏上的哪个通知?_Android_Notifications_Notificationmanager - Fatal编程技术网

Android 如何检测NotificationManager发送的通知的发件人/检测已单击通知栏上的哪个通知?

Android 如何检测NotificationManager发送的通知的发件人/检测已单击通知栏上的哪个通知?,android,notifications,notificationmanager,Android,Notifications,Notificationmanager,我正在开发GPS应用程序。如果用户进入或超出预定义区域,我的应用程序将触发NotificationManager通知。我的应用程序可以为这两种情况发出通知 从onResume()中,我总是获取单击通知的最新intent.setExtra()值,而不是intent.setExtra值 问题是如何检测用户点击通知的区域内或区域外?(我想对不同的案例展示不同的观点) 是否可以为单击的通知添加侦听器 这是我的代码spinet: private void displayNotificationMessag

我正在开发GPS应用程序。如果用户进入或超出预定义区域,我的应用程序将触发NotificationManager通知。我的应用程序可以为这两种情况发出通知

从onResume()中,我总是获取单击通知的最新intent.setExtra()值,而不是intent.setExtra值

问题是如何检测用户点击通知的区域内或区域外?(我想对不同的案例展示不同的观点)

是否可以为单击的通知添加侦听器

这是我的代码spinet:

private void displayNotificationMessage(String message, boolean vibrate, boolean playSound, Intent contentIntent, String notificationTag)
{       

    Notification notification = new Notification(R.drawable.buslogo, message, System.currentTimeMillis());

    PendingIntent myPendingIntent = PendingIntent.getActivity(this.getBaseContext(),0, contentIntent,PendingIntent.FLAG_UPDATE_CURRENT);

    notification.setLatestEventInfo(this, "Friendly Reminder", message, myPendingIntent);

    contentIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);

    if (vibrate)
        notification.vibrate=new long[] {100L, 100L, 200L, 500L};

    if (playSound)
        notification.defaults |= Notification.DEFAULT_SOUND;


    notification.number = ++notificationCounter;
    notificationMgr.notify(notificationTag, notificationCounter, notification);

}

@Override
protected void onNewIntent( Intent intent ) {
    Log.i( TAG, "*********** onNewIntent(), intent = " + intent );
    if (intent.getExtras() != null)
    {
        Log.i(TAG, "in onNewIntent = " + intent.getExtras().getString("test"));
    }
    super.onNewIntent( intent );
    setIntent( intent );
}

@Override
public void onResume() {
    super.onResume();
    Log.i(TAG, "*********** Main - onResume()");

    Intent intent = this.getIntent();
    if (intent.getExtras() != null)
    {
        Log.i(TAG, "test = " + intent.getExtras().getString("test"));
    }
}

public void createNotification(String msnContent)
{
    Intent intent = new Intent();
    intent.setClass(this, Main.class);
    Bundle bundle = new Bundle(); 
    bundle.putString("test", msnContent);
    intent.putExtras(bundle);
    displayNotificationMessage(msnContent, true, true, intent, "test"); 

}
是否可以为单击的通知添加侦听器


对每种情况使用不同的
pendingent
。如果您只是更改一个额外的,请确保在创建
pendingent

时使用
FLAG\u UPDATE\u CURRENT
,我从这篇文章中找到了一个解决方案-。另外,感谢Commonware的帮助

我错过了intent.setAction()

下面是检测已单击通知栏上的哪个通知的代码spinet。希望它能帮助其他有同样问题的人

package com.NotificationTest;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class Main extends Activity {
    private static final String TAG = Main.class.getSimpleName();
    int notificationCounter =0;
    private NotificationManager notificationMgr;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        notificationMgr =(NotificationManager)getSystemService(
                NOTIFICATION_SERVICE);

        notificationMgr.cancelAll();

        Button b1 = (Button) findViewById(R.id.b1);
        b1.setText("B1");
        b1.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                createNotification("From B1");
            }
        });


        Button b2 = (Button) findViewById(R.id.b2);
        b2.setText("B2");
        b2.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                createNotification("From B2");
            }
        });
    }


    private void displayNotificationMessage(String message, boolean vibrate, boolean playSound, Intent contentIntent, String notificationTag)
    {       

        Notification notification = new Notification(R.drawable.icon, message, System.currentTimeMillis());


        contentIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);

        PendingIntent myPendingIntent = PendingIntent.getActivity(this.getBaseContext(),0, contentIntent,PendingIntent.FLAG_UPDATE_CURRENT);


        notification.setLatestEventInfo(this, "Friendly Reminder", message, myPendingIntent);



        /*if (vibrate)
            notification.vibrate=new long[] {100L, 100L, 200L, 500L};

        if (playSound)
            notification.defaults |= Notification.DEFAULT_SOUND;*/


        notification.number = ++notificationCounter;
        notificationMgr.notify(notificationTag, notificationCounter, notification);

    }

    @Override
    protected void onNewIntent( Intent intent ) {
        Log.i( TAG, "*********** onNewIntent(), intent = " + intent );
        if (intent.getExtras() != null)
        {
            Log.i(TAG, "in onNewIntent = " + intent.getExtras().getString("test"));
        }
        super.onNewIntent( intent );
        setIntent( intent );
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.i(TAG, "*********** Main - onResume()");

        Intent intent = this.getIntent();
        if (intent.getExtras() != null)
        {
            String extraOfClickedNotification = intent.getExtras().getString("test");

            Log.i(TAG, "test = " + extraOfClickedNotification);

            if (extraOfClickedNotification.equals("From B1"))
            {
                // Do something
            }
            else if (extraOfClickedNotification.equals("From B1"))
            {
                // Do something
            }
        }
    }

    public void createNotification(String msgContent)
    {
        Intent intent = new Intent();
        intent.setAction(msgContent + System.currentTimeMillis());
        intent.setClass(this, Main.class);
        Bundle bundle = new Bundle(); 
        bundle.putString("test", msgContent);
        intent.putExtras(bundle);
        displayNotificationMessage(msgContent, true, true, intent, "test"); 

    }

}

谢谢,我已经修改了我的代码。每次通过notificationMgr.notify()发送通知之前,我都会将一个新的PendingEvent对象传递给notification.SetLateStevenInfo()。但它仍然无法区分已单击通知栏上的哪个通知。因为onResume()总是返回最新的setExtra()值。有没有办法将值/对象从原始活动传递到通知调用的意图?@user767987:“因为onResume()总是返回最新的setExtra()值。”再次感谢。我已经阅读了您提供的链接,并将Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP添加到传递给pendingent的Intent。但是我发现onNewIntent(Intent-Intent)仍然获得了我传递给notification.setLateStevenInfo()的最新意图。有什么不对劲吗?或者有没有其他方法来区分在通知栏上单击了哪个通知?@Android初学者:“但是我发现onNewIntent(意图-意图)仍然获得了我传递给通知的最新意图。setLatestEventInfo()”--这正是你想要的。