Reputation: 21877
MyService class contains static strings
package com.suprabhatam.alarm;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class MyService extends Service {
private static final String TAG = "MyService";
static public MediaPlayer mp;
final static public String start_pause_stop_audio = "start_pause_stop_audio";
final static public String start_audio = "start_audio";
final static public String pause_audio = "pause_audio";
final static public String stop_audio = "stop_audio";
@Override
public int onStartCommand (Intent intent, int flags, int startId) {
Calendar cal = Calendar.getInstance();
cal.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Log.d(TAG, sdf.format(cal.getTime()));
if (mp == null) {
mp = MediaPlayer.create(this, R.raw.venkateshwara_suprabhatam);
}
final String s_s_audio = intent.getStringExtra(MyService.start_pause_stop_audio);
Log.d(TAG, "onStartCommand: " + s_s_audio);
if (s_s_audio.equals(start_audio)) {
if (!mp.isPlaying()) {
mp.start();
} else {
Log.d(TAG, "already playing");
}
} else if (s_s_audio.equals(pause_audio)) {
mp.pause();
} else if (s_s_audio.equals(stop_audio)) {
mp.seekTo(0);
mp.pause();
} else {
Log.d(TAG, "UNKNOWN: " + s_s_audio);
}
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
Crashes the application, with the following message on the adb output.
ANRAppManager﹕ !!! It is not under singleton mode, U can't use it. !!!
The crash occurs only when the application is not in memory(kill ) and the MyReceiver tries to access the static strings.
It looks like the static strings are not valid until the object is created. In C++ the static strings go to the data segment and are valid when the application boots, are the rules different in java ?.
UPDATE 1: Adding the logcat message
01-20 21:53:32.849 2396-2396/com.suprabhatam.alarm D/jdwp﹕ sendBufferedRequest : len=0x45
01-20 21:53:32.854 2396-2396/com.suprabhatam.alarm W/asset﹕ AssetManager-->addDefaultAssets CIP path not exsit!
01-20 21:53:32.875 2396-2396/com.suprabhatam.alarm D/dalvikvm﹕ open_cached_dex_file : /data/app/com.suprabhatam.alarm-1.apk /data/dalvik-cache/data@[email protected]@classes.dex
01-20 21:53:32.897 2396-2396/com.suprabhatam.alarm D/MyService﹕ 21:53:32
01-20 21:53:32.959 2396-2396/com.suprabhatam.alarm D/MediaPlayer﹕ Don't notify duration to com.suprabhatam.alarm!
01-20 21:53:32.983 2396-2396/com.suprabhatam.alarm D/AndroidRuntime﹕ Shutting down VM
01-20 21:53:32.983 2396-2396/com.suprabhatam.alarm W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41bea9a8)
01-20 21:53:32.984 2396-2396/com.suprabhatam.alarm W/dalvikvm﹕ threadid=1: uncaught exception occurred
01-20 21:53:32.984 2396-2396/com.suprabhatam.alarm W/System.err﹕ java.lang.RuntimeException: Unable to start service com.suprabhatam.alarm.MyService@421b4720 with null: java.lang.NullPointerException
01-20 21:53:32.984 2396-2396/com.suprabhatam.alarm W/System.err﹕ at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2867)
01-20 21:53:32.984 2396-2396/com.suprabhatam.alarm W/System.err﹕ at android.app.ActivityThread.access$1900(ActivityThread.java:165)
01-20 21:53:32.984 2396-2396/com.suprabhatam.alarm W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470)
01-20 21:53:32.984 2396-2396/com.suprabhatam.alarm W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:107)
01-20 21:53:32.984 2396-2396/com.suprabhatam.alarm W/System.err﹕ at android.os.Looper.loop(Looper.java:194)
01-20 21:53:32.984 2396-2396/com.suprabhatam.alarm W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5391)
01-20 21:53:32.985 2396-2396/com.suprabhatam.alarm W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
01-20 21:53:32.985 2396-2396/com.suprabhatam.alarm W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:525)
01-20 21:53:32.985 2396-2396/com.suprabhatam.alarm W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
01-20 21:53:32.985 2396-2396/com.suprabhatam.alarm W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
01-20 21:53:32.985 2396-2396/com.suprabhatam.alarm W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
01-20 21:53:32.985 2396-2396/com.suprabhatam.alarm W/System.err﹕ Caused by: java.lang.NullPointerException
01-20 21:53:32.986 2396-2396/com.suprabhatam.alarm W/System.err﹕ at com.suprabhatam.alarm.MyService.onStartCommand(MyService.java:34)
01-20 21:53:32.986 2396-2396/com.suprabhatam.alarm W/System.err﹕ at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2850)
01-20 21:53:32.986 2396-2396/com.suprabhatam.alarm W/System.err﹕ ... 10 more
01-20 21:53:32.986 2396-2396/com.suprabhatam.alarm W/dalvikvm﹕ threadid=1: calling UncaughtExceptionHandler
01-20 21:53:32.987 2396-2396/com.suprabhatam.alarm E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start service com.suprabhatam.alarm.MyService@421b4720 with null: java.lang.NullPointerException
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2867)
at android.app.ActivityThread.access$1900(ActivityThread.java:165)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5391)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.suprabhatam.alarm.MyService.onStartCommand(MyService.java:34)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2850)
at android.app.ActivityThread.access$1900(ActivityThread.java:165)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5391)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
UPDATE 2 second crash
01-20 21:56:23.332 2793-2799/com.suprabhatam.alarm D/jdwp﹕ handlePacket : cmd=0x1, cmdSet=0xC7, len=0x13, id=0x400000DF, flags=0x0, dataLen=0x8
01-20 21:56:42.336 2793-2805/com.suprabhatam.alarm D/ANRAppManager﹕ !!! It is not under singleton mode, U can't use it. !!!
01-20 21:57:33.091 2793-2793/com.suprabhatam.alarm I/Process﹕ Sending signal. PID: 2793 SIG: 9
01-20 21:57:38.252 3008-3008/com.suprabhatam.alarm D/MediaPlayer﹕ Don't notify duration to com.suprabhatam.alarm!
01-20 21:57:38.260 3008-3008/com.suprabhatam.alarm D/AndroidRuntime﹕ Shutting down VM
01-20 21:57:38.260 3008-3008/com.suprabhatam.alarm W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41bea9a8)
01-20 21:57:38.260 3008-3008/com.suprabhatam.alarm W/dalvikvm﹕ threadid=1: uncaught exception occurred
01-20 21:57:38.260 3008-3008/com.suprabhatam.alarm W/System.err﹕ java.lang.RuntimeException: Unable to start service com.suprabhatam.alarm.MyService@421af568 with null: java.lang.NullPointerException
01-20 21:57:38.260 3008-3008/com.suprabhatam.alarm W/System.err﹕ at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2867)
01-20 21:57:38.260 3008-3008/com.suprabhatam.alarm W/System.err﹕ at android.app.ActivityThread.access$1900(ActivityThread.java:165)
01-20 21:57:38.260 3008-3008/com.suprabhatam.alarm W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470)
01-20 21:57:38.260 3008-3008/com.suprabhatam.alarm W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:107)
01-20 21:57:38.260 3008-3008/com.suprabhatam.alarm W/System.err﹕ at android.os.Looper.loop(Looper.java:194)
01-20 21:57:38.261 3008-3008/com.suprabhatam.alarm W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5391)
01-20 21:57:38.261 3008-3008/com.suprabhatam.alarm W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
01-20 21:57:38.261 3008-3008/com.suprabhatam.alarm W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:525)
01-20 21:57:38.261 3008-3008/com.suprabhatam.alarm W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
01-20 21:57:38.261 3008-3008/com.suprabhatam.alarm W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
01-20 21:57:38.261 3008-3008/com.suprabhatam.alarm W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
01-20 21:57:38.261 3008-3008/com.suprabhatam.alarm W/System.err﹕ Caused by: java.lang.NullPointerException
01-20 21:57:38.261 3008-3008/com.suprabhatam.alarm W/System.err﹕ at com.suprabhatam.alarm.MyService.onStartCommand(MyService.java:34)
01-20 21:57:38.261 3008-3008/com.suprabhatam.alarm W/System.err﹕ at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2850)
01-20 21:57:38.261 3008-3008/com.suprabhatam.alarm W/System.err﹕ ... 10 more
01-20 21:57:38.261 3008-3008/com.suprabhatam.alarm W/dalvikvm﹕ threadid=1: calling UncaughtExceptionHandler
01-20 21:57:38.262 3008-3008/com.suprabhatam.alarm E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start service com.suprabhatam.alarm.MyService@421af568 with null: java.lang.NullPointerException
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2867)
at android.app.ActivityThread.access$1900(ActivityThread.java:165)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5391)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.suprabhatam.alarm.MyService.onStartCommand(MyService.java:34)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2850)
at android.app.ActivityThread.access$1900(ActivityThread.java:165)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5391)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
01-20 21:57:58.221 3008-3020/com.suprabhatam.alarm D/ANRAppManager﹕ !!! It is not under singleton mode, U can't use it. !!!
01-20 22:02:38.277 3008-3008/com.suprabhatam.alarm I/Process﹕ Sending signal. PID: 3008 SIG: 9
Update 3 crash location identified
The crash is at line 32 of MyService.java
final String s_s_audio = intent.getStringExtra(MyService.start_pause_stop_audio)
01-20 22:22:42.230 6257-6257/com.suprabhatam.alarm E/MyService﹕ exception java.lang.NullPointerException at com.suprabhatam.alarm.MyService.onStartCommand(MyService.java:32) at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2850) at android.app.ActivityThread.access$1900(ActivityThread.java:165)
The problem seems to be with the intent.getStringExtra() method
The Broadcast receiver sends the following event.
Intent myIntent = new Intent(context, MyService.class);
myIntent.putExtra(MyService.start_pause_stop_audio, MyService.start_audio);
context.startService(myIntent);
How to debug this issue.
Upvotes: 0
Views: 1484
Reputation: 13548
You should check if the intent param received in the onStartCommand()
is null before doing any operation. This because the Intent
can be null if the service is killed and then restarted by the system and you don't ask to resend the original intent.
Please take a deep look here and eventually change the result value for the onStartCommand()
to START_REDELIVER_INTENT
,
Upvotes: 2
Reputation: 6283
better solution is to get your strings from one public class for example YourConstants.java and all members inside this class to be : public static final String;
Then when you need them no matter where in your project just call YourConstants.NAME_OFF_YOUR_VARIABLE and you will not have this problem.
I always use Constants class for my public static final variables.
Upvotes: 0