【问题标题】:Android parcelable object passes to activity but not to serviceAndroid parcelable 对象传递给活动但不传递给服务
【发布时间】:2016-12-31 09:26:02
【问题描述】:

我想向活动和服务发送一个可打包的对象。对于发送给我使用的两个:

public void onClick(View view) {
    Intent intent = new Intent(mContext, MainActivity.class);
    Intent i = new Intent(mContext, OverlayService.class);
    intent.putExtra(ITEM_KEY, item);
    i.putExtra(ITEM_KEY, item);
    mContext.startActivity(intent);
}

然后在我的活动中接收:

DataItem item = getIntent().getExtras().getParcelable(DataItemAdapter.ITEM_KEY);
    if (item == null) {
        throw new AssertionError("Null data item received!");
    }

这非常有效。但对于我的服务,我使用:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    DataItem item = intent.getExtras().getParcelable(DataItemAdapter.ITEM_KEY);
    if (item == null) {
        throw new AssertionError("Null data item received!");
    }else{
        Toast.makeText(this, "Item received", Toast.LENGTH_SHORT).show();
    }
    return START_STICKY;
}

结果是空指针异常:

Unable to start service com.madhatter.nat.test.OverlayService@7aae5dd with Intent { cmp=com.madhatter.nat.test/.OverlayService }: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Parcelable android.os.Bundle.getParcelable(java.lang.String)' on a null object reference
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3314)
at android.app.ActivityThread.-wrap21(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1565)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Parcelable android.os.Bundle.getParcelable(java.lang.String)' on a null object reference
at com.madhatter.nat.test.OverlayService.onStartCommand(OverlayService.java:46)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3297)
at android.app.ActivityThread.-wrap21(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1565) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6077) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

这是我用来启动服务的代码:

public void show(View view) {
    checkPermissionOverlay();
    Intent svc = new Intent(this, OverlayService.class);
    startService(svc);
    notificationService();
}

任何想法我做错了什么?感谢您的帮助。

【问题讨论】:

  • 显示用于启动服务的代码。
  • 我已添加到请求的代码中。

标签: java android service nullpointerexception parcelable


【解决方案1】:

您需要在用于启动服务的 Intent 中包含额外内容,其方式与启动 Activity 的方式相同。

public void show(View view) {
    checkPermissionOverlay();
    Intent svc = new Intent(this, OverlayService.class);
    svc.putExtra(DataItemAdapter.ITEM_KEY, dataItem);
    startService(svc);
    notificationService();
}

【讨论】:

    猜你喜欢
    • 2019-07-01
    • 2015-08-26
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    相关资源
    最近更新 更多