我有一项服务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.
答案 0 :(得分:0)
根据您的日志,错误必须在
MyService.java:184
您正在读取数组的元素-1
如果您发布MyService.java的源代码,则应该很容易发现问题