0

据我所知,Java 总是通过“按值传递”来调用方法。但我看到了 Android 的 NotificationManager.notify(String, int, Notification) 的参考:

退货

 the id of the notification that is associated with the string

可用于取消通知的标识符

请参考参考:http: //developer.android.com/reference/android/app/NotificationManager.html

怎么会这样?有什么我误解了吗?

BR,亨利

4

4 回答 4

3

关于本声明:

“Java 通过值传递原语,但通过引用传递对象。”

这并不准确。Java 通过值传递一切,它根本不传递对象。

  • 对于原语:副本被传输到方法(不要忘记 String 不是原语) - 你说的是正确的
  • 对于参考变量:它们也通过值传输:参考变量的副本被传输到方法。所以对象本身永远不会被传输。可以在方法中更改对象(通过调用它的一些方法),并且您将在从方法返回后看到修改(例如,您从 Person 对象更改“名称”成员),但如果您更改引用,这更改将在方法之外不可见:

更改引用是由“new”运算符或通过像 param = some_other_reference 之类的赋值(其中 some_other_referece 指向堆上的某个其他对象)进行的。更改引用不会影响“原始”引用,而只会影响“复制引用”(方法内部使用的引用)。

于 2010-11-12T09:07:05.897 回答
0

似乎NotificationManager 的 API 参考有点混乱。

这是通过Google Code Search 在 NotificationManager 和 Android 上找到的代码:

/**
 * Persistent notification on the status bar,
 *
 * @param tag An string identifier for this notification unique within your
 *        application.
 * @param notification A {@link Notification} object describing how to
 *        notify the user, other than the view you're providing. Must not be null.
 * @return the id of the notification that is associated with the string identifier that
 * can be used to cancel the notification
 */
public void notify(String tag, int id, Notification notification)
{
    int[] idOut = new int[1];
    INotificationManager service = getService();
    String pkg = mContext.getPackageName();
    if (localLOGV) Log.v(TAG, pkg + ": notify(" + id + ", " + notification + ")");
    try {
        service.enqueueNotificationWithTag(pkg, tag, id, notification, idOut);
        if (id != idOut[0]) {
            Log.w(TAG, "notify: id corrupted: sent " + id + ", got back " + idOut[0]);
        }
    } catch (RemoteException e) {
    }
}

显然参数没有返回值。他们打算有一个类似的 JavaDoc,但可能犯了一个错误。

查看其他变体的代码notify

/**
 * Persistent notification on the status bar,
 *
 * @param id An identifier for this notification unique within your
 *        application.
 * @param notification A {@link Notification} object describing how to
 *        notify the user, other than the view you're providing. Must not be null.
 */
public void notify(int id, Notification notification)
{
    notify(null, id, notification);
}

tag正如你所看到的,这个重载版本只是使用默认的String 值调用主实现null


关于按值传递和按引用传递的一般问题,简单/粗俗的解释是:

  • Java 按值传递原语,
  • 但通过引用传递对象。

有关说明,请参阅 arnivan 和 Patrick 的评论。

于 2010-11-12T08:28:24.313 回答
0

文档对我来说似乎是错误的。声明说:

public void notify (String tag, int id, Notification notification)

但同时它说它返回了一些东西。

我将其解释为:id唯一映射到有问题的通知,并且可以在取消通知时使用。

于 2010-11-12T08:28:52.737 回答
0

同意以前的海报:文档似乎不正确。该方法需要三个参数,但在 javadoc 中只提到了其中两个。只需通过 @param 替换 @return 即可获得 id 参数的描述:

与可用于取消通知的字符串标识符关联的通知的 id

编辑:您可以自己定义此 id 并稍后使用它来取消通知。

于 2010-11-12T10:05:50.113 回答