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

Reply via email to