2016-12-31 113 views
0

我想发送一个parcelable对象到活动和服务。对于发送这两个我用:Android可parcelable对象传递到活动,但不传递到服务

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 [email protected] 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(); 
} 

任何想法我做错了吗?谢谢你的帮助。

+0

显示您用来启动服务的代码。 – riggaroo

+0

我已添加到要求的代码中。 –

回答

1

您需要在您用来启动服务的意图中包含额外项目,这与您开始活动的方式相同。

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