【问题标题】:IntentService, how to manage extras properly?IntentService,如何正确管理 extras?
【发布时间】:2012-12-19 08:05:36
【问题描述】:

您好,我尝试使用额外的字符串启动 IntentService,但它抛出空指针异常,我搜索但没有找到任何东西,所以我问它。似乎服务无法提取意图的额外内容,不知道是不是因为我忘记了什么,是我第一次使用 IntentService。

嗯,主要是我的意图:

    String url = MY_HOST+"/videos/video.mp4";
    Intent intent = new Intent(this, VideosDownloader.class);
    intent.putExtra("url", url);
    startService(intent);

在服务中,我管理额外的:

public class VideosDownloader extends IntentService{


public VideosDownloader() {
    super("VideosDownloader");
    // TODO Auto-generated constructor stub
}

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

 @Override
 protected void onHandleIntent(Intent intent) {

        String url = intent.getStringExtra("url");
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
        request.setDescription("Some descrition");
        request.setTitle("Some title");

        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "video.mp4");
        request.setVisibleInDownloadsUi(true);
        // get download service and enqueue file
        DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
        manager.enqueue(request);

 }
}

在 Manifest 中我认为一切正常,我声明为服务:

<uses-sdk
    android:minSdkVersion="9"
    android:targetSdkVersion="15" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:debuggable="true" >
    <activity
        android:name=".MainActivity"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>


    <service android:name=".VideosDownloader"/>
</application>

错误抛出是:

12-19 08:45:50.482: E/AndroidRuntime(15470): FATAL EXCEPTION: main
12-19 08:45:50.482: E/AndroidRuntime(15470): java.lang.RuntimeException: Unable to start service com.example.downloadtest.VideosDownloader@40525e50 with Intent { cmp=com.example.downloadtest/.VideosDownloader (has extras) }: java.lang.NullPointerException
12-19 08:45:50.482: E/AndroidRuntime(15470):    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2073)
12-19 08:45:50.482: E/AndroidRuntime(15470):    at android.app.ActivityThread.access$2800(ActivityThread.java:121)
12-19 08:45:50.482: E/AndroidRuntime(15470):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1006)
12-19 08:45:50.482: E/AndroidRuntime(15470):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-19 08:45:50.482: E/AndroidRuntime(15470):    at android.os.Looper.loop(Looper.java:138)
12-19 08:45:50.482: E/AndroidRuntime(15470):    at android.app.ActivityThread.main(ActivityThread.java:3701)
12-19 08:45:50.482: E/AndroidRuntime(15470):    at java.lang.reflect.Method.invokeNative(Native Method)
12-19 08:45:50.482: E/AndroidRuntime(15470):    at java.lang.reflect.Method.invoke(Method.java:507)
12-19 08:45:50.482: E/AndroidRuntime(15470):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
12-19 08:45:50.482: E/AndroidRuntime(15470):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
12-19 08:45:50.482: E/AndroidRuntime(15470):    at dalvik.system.NativeStart.main(Native Method)
12-19 08:45:50.482: E/AndroidRuntime(15470): Caused by: java.lang.NullPointerException
12-19 08:45:50.482: E/AndroidRuntime(15470):    at android.app.IntentService.onStart(IntentService.java:110)
12-19 08:45:50.482: E/AndroidRuntime(15470):    at android.app.IntentService.onStartCommand(IntentService.java:118)
12-19 08:45:50.482: E/AndroidRuntime(15470):    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2060)
12-19 08:45:50.482: E/AndroidRuntime(15470):    ... 10 more

感谢您的回复。

已解决:对不起,我的错,David Wasser 给了我解决方案,询问我是否发布了所有代码,我重写了 Oncreate() 什么都不做,我忘记了它应该有 super 所以我删除了它(因为它什么也没做)。感谢回复!

【问题讨论】:

  • 在onStart中也贴出代码
  • @TomerMor 异常发生在IntentService.onStart()。这不是 OP 的代码,这是 Android 代码。 OP 没有onStart() 方法。
  • 实际上直到 API 级别 3 从那时起就有 onStartCommand,我测试了你的代码,它对我来说工作正常,直到 onHandleIntent 所以尝试启动服务并在那里提取意图
  • 好的,我会看看这个谢谢!如果我找到解决方案,我会发布。
  • 这里发生了一些非常奇怪的事情。确保你清理你的项目并重建它。然后检查日志,看看日志中是否还有其他有用的信息。看起来 Android 无法启动您的服务(无论出于何种原因)。您是否发布了该服务的所有代码?

标签: android android-service


【解决方案1】:

尝试删除方法onBind:

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

因为IntentService 有它的实现。

【讨论】:

  • 我删除了绑定但它没有工作我解决了它,我把评论放在我的答案中。
【解决方案2】:

已解决:对不起,我的错,David Wasser 给了我解决方案,询问我是否发布了所有代码,我重写了 Oncreate() 什么都不做,我忘记了它应该有 super 所以我删除了它(因为它什么也没做)。感谢回复!

【讨论】:

    猜你喜欢
    • 2011-10-15
    • 1970-01-01
    • 2019-07-25
    • 2019-09-16
    • 2013-11-26
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多