android - Using Service, TimerTask and BroadcastReceiver to check for various updates -


i'm trying create simple program following:

  1. a service (newsservice) started activity (updateserviceactivity) checks news.
  2. if news found (newsservice) sends broadcast receiver (newsreceiver).
  3. upon receiving broadcast receiver (newsreceiver) should notify activity (updateserviceactivity) there news.
  4. 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 used timer)

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

Popular posts from this blog

objective c - Change font of selected text in UITextView -

php - Accessing POST data in Facebook cavas app -

c# - Getting control value when switching a view as part of a multiview -