android - Using Service, TimerTask and BroadcastReceiver to check for various updates -
i'm trying create simple program following:
- a service (newsservice) started activity (updateserviceactivity) checks news.
- if news found (newsservice) sends broadcast receiver (newsreceiver).
- upon receiving broadcast receiver (newsreceiver) should notify activity (updateserviceactivity) there news.
- upon notification, activity (updateserviceactivity) gets news , handles them.
so far i'm working on simple example. here code far:
updateserviceactivity
public class updateserviceactivity extends activity implements onclicklistener { private static final string tag = "updateserviceactivity"; button buttonstart, buttonstop; broadcastreceiver receiver; @override public void oncreate( bundle savedinstancestate ) { super.oncreate( savedinstancestate ); setcontentview( r.layout.main ); buttonstart = (button) findviewbyid( r.id.buttonstart ); buttonstop = (button) findviewbyid( r.id.buttonstop ); buttonstart.setonclicklistener( ); buttonstop.setonclicklistener( ); receiver = new newsreceiver(); } @override protected void onpause() { super.onpause(); unregisterreceiver( receiver ); } @override protected void onresume() { super.onresume(); registerreceiver( receiver, new intentfilter() ); } public void onclick( view src ) { switch( src.getid() ) { case r.id.buttonstart: log.e( tag, "onclick: starting service" ); startservice( new intent( this, newsservice.class ) ); break; case r.id.buttonstop: log.e( tag, "onclick: stopping service" ); stopservice( new intent( this, newsservice.class ) ); break; } } }
newsservice
public class newsservice extends service { public static final string news_intent = "bs.kalender.news"; private timer timer = new timer(); @override public ibinder onbind( intent arg0 ) { return null; } @override public void onstart( intent intent, int startid ) { startservice(); } private void startservice() { timer.scheduleatfixedrate( new newschecker(), 0, 5000 ); } private class newschecker extends timertask { @override public void run() { intent intent = new intent( getapplicationcontext(), newsreceiver.class ); sendbroadcast( intent ); } } }
newsreceiver
public class newsreceiver extends broadcastreceiver { @override public void onreceive( context context, intent intent ) { toast.maketext( context, "broadcast recieved! there news!", toast.length_short).show(); } }
manifest
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="bs.update" android:versioncode="1" android:versionname="1.0"> <uses-sdk android:minsdkversion="7" /> <uses-permission android:name="android.permission.internet" /> <uses-permission android:name="android.permission.write_external_storage"></uses-permission> <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true"> <activity android:name=".updateserviceactivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> <service android:name=".newsservice" /> <receiver android:name=".newsreceiver" /> </application> </manifest>
the problems run in are:
- when hitting 'home'-button (the app goes background, , on pause called) newsreceiver keeps firing toasts. of understanding once unregister receiver, shouldn't availible receiving broadcast.
- even if hit button stop newsservice, timertask keeps running , posting broadcast.
what doing wrong? general misunderstanding of how broadcasting/receiving works? on track , should changed accomplish desire?
- you creating , unregistering new
receiver
instance, has no effect on receiver have registered in manifest file. try removing manifest. - you never cancel
timer
that's why keeps firing. stopping service doesn't automatically stop threads have created (such 1 usedtimer
)
generally, should use alarmmanager
intentservice
schedule repeating background tasks. timer
unreliable , doesn't fit android framework. also, timer
won't execute if phone asleep. can have alarms wake phone execute (whether idea news-updating service matter) alarmmanager
.
Comments
Post a Comment