The offending line is this:
public myService(String name) {
super(name);
setIntentRedelivery(true);
}
Android instantiates components (services, activities) using the component's
default constructor.
An explicit non-default constructor like the above prevents the compiler
from generating the default one, and it can't use any constructors with
arguments because it has no way to know what they values would be.
Then Android fails to instantiate your service.
Change the constructor to:
public myService(/* no arguments */) {
super("some name string");
setIntentRedelivery(true);
}
The reason IntentService and WakefulIntentService have a constructor with a
string parameter is they are meant to be subclassed. And that's something
you could consider as well to improve maintainability.
-- Kostya
2011/6/5 Simon Platten <[email protected]>
> Earlier I posted a question regarding a problem I'm having with my
> BroadcastReceiver and onReceive method. I found that the logic in onReceive
> would sometimes crash and I couldn't find an explanation why, one road I
> went down was to try creating a thread in onReceive, whilst this was better,
> it didn't cure the problem altogether.
>
> I then got a response from "Mark Murphy", pointing me in the direction of
> the CWAC demo, which I am looking at, but having tried to implement the same
> techniques used in the demo, my intent fails to launch with an error in the
> logger "no init"...I've compared my code to the CWAC demo and cannot see
> what I'm missing.
>
> In summary, my application starts off with an activity that gets input
> from the user, it then installs a repeating alarm, the alarm works well and
> I can see that the BroadcastReceiver onRecieve method is called reliably,
> however sometimes there is a crash in the onReceive method, it continues to
> be scheduled at the specified interval, but fails to work from this point
> on. All my efforts to find out why have failed.
>
> I am changing the wallpaper via the WallpaperManager in the onReceive. Now
> I am trying to implement the same technique used byt eh CWAV demo, but it
> fails. Here is my Receiver:
>
> [code]
> public class myReciever extends BroadcastReceiver {
> @Override
> public void onReceive(Context context, Intent intent) {
> myService.sendWakefulWork( context );
> }
> }
> [/code]
>
> Here is the myService class:
>
> [code]
> public class myService extends IntentService {
> private static final String LOCK_NAME_STATIC = "myService";
>
> private static volatile PowerManager.WakeLock m_lockStatic = null;
>
> synchronized private static PowerManager.WakeLock getLock(Context
> context) {
> if( m_lockStatic == null ) {
> PowerManager mgr =
> (PowerManager)context.getSystemService(Context.POWER_SERVICE);
> m_lockStatic = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
> LOCK_NAME_STATIC);
> m_lockStatic.setReferenceCounted(true);
> }
> return m_lockStatic;
> }
>
> public static void sendWakefulWork(Context context, Intent i) {
> getLock(context).acquire();
> context.startService( i );
> }
>
> public static void sendWakefulWork( Context ctxt ) {
> Intent intent = new Intent( ctxt, myService.class );
> sendWakefulWork( ctxt, intent );
> }
>
> public myService(String name) {
> super(name);
> setIntentRedelivery(true);
> }
>
> @Override
> public int onStartCommand(Intent intent, int flags, int startId) {
> if ( (flags & START_FLAG_REDELIVERY) != 0 ) { // if crash
> restart...
> getLock(this).acquire(); // ...then quick grab
> the lock
> }
> super.onStartCommand(intent, flags, startId);
> return START_REDELIVER_INTENT;
> }
>
> @Override
> final protected void onHandleIntent(Intent intent) {
> try {
> doWakefulWork(intent);
> } finally {
> getLock(this).release();
> }
> }
>
> private void doWakefulWork( Intent intent ) {
> // ... Do something, but it never gets here !
>
> }
> }
> [/code]
>
> The manifest file:
> [code]
> <?xml version="1.0" encoding="utf-8"?>
> <manifest xmlns:android="http://schemas.android.com/apk/res/android"
> package="com.myPackage"
> android:versionName="1.1" android:versionCode="1">
> <application android:icon="@drawable/icon"
> android:label="@string/app_name">
> <activity android:name=".awrActivity"
> android:label="@string/app_name">
> <intent-filter>
> <action android:name="android.intent.action.MAIN" />
> <category android:name="android.intent.category.LAUNCHER"
> />
> </intent-filter>
> </activity>
> <receiver android:name="uk.co.cantley.avasig.myReciever" />
> <service android:name="uk.co.cantley.avasig.myService" />
> </application>
> <uses-sdk android:minSdkVersion="7" />
> <uses-permission android:name="android.permission.SET_WALLPAPER"/>
> <uses-permission android:name="android.permission.WAKE_LOCK"/>
> <supports-screens android:largeScreens="true"
> android:normalScreens="true"
> android:smallScreens="true"
> android:resizeable="false"
> android:anyDensity="true"/>
> </manifest>
> [/code]
>
> Thank you,
> Simon
>
> --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en