在启动服务时Android应用程序崩溃了吗?

时间:2014-07-16 15:20:24

标签: android service

我有一项服务MyService,我在一个小型测试应用程序中使用一个简单的按钮启动,如下所示(整个MainActivity的源代码):

package com.example.testapp;

import android.support.v7.app.ActionBarActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button startButton = (Button) findViewById(R.id.button1);
        startButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), MyService.class);
                startService(intent);               
            }
        });
        Button stopButton = (Button) findViewById(R.id.button2);
        stopButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

这似乎工作正常 - 服务启动,并且pebble从我的Android应用程序接收它所需的数据。

但是,我希望在启动时让这项服务在后台运行,而不是仅仅在应用程序启动时运行。显然,这样做的方法是在清单文件中声明引导权限以及服务本身:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

...

<service android:name="com.example.testapp.MyService" android:exported="false"/>

除了声明BroadcastReceiver

之外
public class OnStartReceiver extends BroadcastReceiver {   

    @Override
    public void onReceive(Context context, Intent intent) {

     Intent myIntent = new Intent(context, MyService.class);
     context.startService(myIntent);
    }
}

假设这是启动服务的正确实现,当我重新启动Android设备并给所有时间加载(并确保Pebble连接到我的手机)时,当我尝试从中获取数据时Android设备通过Pebble(实际上,与Service交互),测试应用程序崩溃。然后我进入Settings-&gt; Applications并发现虽然我的测试应用程序的进程已经崩溃,但该服务仍在运行,尽管它没有按预期运行,可能已经死了。

我不知道为什么会出现这个问题。如果有人有任何建议,我很乐意听到他们的意见。

谢谢!

编辑:

相关的Logcat输出:

V/Zygote  ( 2572): Switching descriptor 33 to /dev/null
V/Zygote  ( 2572): Switching descriptor 9 to /dev/null
D/dalvikvm( 2572): Late-enabling CheckJNI
I/ActivityManager(  736): Start proc com.example.testapp for broadcast com.example.testapp/.OnStartReceiver: pid=2572 uid=10144 gids={50144}
D/ActivityThread( 2572): handleBindApplication:com.example.testapp
D/ActivityThread( 2572): setTargetHeapUtilization:0.75
D/ActivityThread( 2572): setTargetHeapMinFree:524288
I/System.out( 2572): service is started
D/AndroidRuntime( 2572): Shutting down VM
W/dalvikvm( 2572): threadid=1: thread exiting with uncaught exception (group=0x415dcce0)
E/AndroidRuntime( 2572): FATAL EXCEPTION: main
E/AndroidRuntime( 2572): Process: com.example.testapp, PID: 2572
E/AndroidRuntime( 2572): java.lang.RuntimeException: Error receiving broadcast Intent { act=com.getpebble.action.app.RECEIVE_NACK flg=0x10 (has extras) } in com.example.testapp.MyService$1$2@4187ce88
E/AndroidRuntime( 2572):    at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:785)
E/AndroidRuntime( 2572):    at android.os.Handler.handleCallback(Handler.java:733)
E/AndroidRuntime( 2572):    at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime( 2572):    at android.os.Looper.loop(Looper.java:136)
E/AndroidRuntime( 2572):    at android.app.ActivityThread.main(ActivityThread.java:5149)
E/AndroidRuntime( 2572):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 2572):    at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime( 2572):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
E/AndroidRuntime( 2572):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
E/AndroidRuntime( 2572):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 2572): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=60; index=-1
E/AndroidRuntime( 2572):    at java.util.ArrayList.get(ArrayList.java:310)
E/AndroidRuntime( 2572):    at com.example.testapp.MyService$1$2.receiveNack(MyService.java:184)
E/AndroidRuntime( 2572):    at com.getpebble.android.kit.PebbleKit$PebbleNackReceiver.onReceive(PebbleKit.java:627)
E/AndroidRuntime( 2572):    at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:775)
E/AndroidRuntime( 2572):    ... 9 more
I/Process ( 2572): Sending signal. PID: 2572 SIG: 9
I/ActivityManager(  736): Process com.example.testapp (pid 2572) has died.

1 个答案:

答案 0 :(得分:0)

根据您的日志,错误必须在

  

MyService.java:184

您正在读取数组的元素-1

如果您发布MyService.java的源代码,则应该很容易发现问题