Android background service with background thread causing anr error -


i have implemented android service performs following long operations

  1. when screen goes off start recording accelerometer data.
  2. when data reaches 3000 samples write file.
  3. then perform data processing on after reading recorded data.
  4. then extract gait template data.
  5. then compute similarity score.
  6. i want keep service running long user explicitly not quit service.

in case if screen goes on stop data recording , check if number of samples more minimum number of samples repeat steps 2-5. else drop recorded samples.

i have broadcast receiver screen_on , screen _off broadcasts writing file works fine time taking part feature (or template generation) read android documentation

a service runs in main thread of hosting process—the service not create own thread , not run in separate process (unless specify otherwise). means that, if service going cpu intensive work or blocking operations (such mp3 playback or networking), should create new thread within service work. using separate thread, reduce risk of application not responding (anr) errors , application's main thread can remain dedicated user interaction activities.

therefore trying implement service background thread. still getting anr errors ?.

public class gaitauthenticationservice extends service {  int mstartmode;       // indicates how behave if service killed ibinder mbinder;      // interface clients bind boolean mallowrebind; // indicates whether onrebind should used private int servicestate = 0; // maintain state of our service private broadcastreceiver screenonoffreceiver = new screenoffbroadcastreciever();; private sensormanager msensormanager; private powermanager mpowermanager; private powermanager.wakelock mlock; private accelrecordertesting maccelrecorder; private context context; private boolean screenoff; private keyguardmanager keygaurdmanager; private boolean screenstate; private intentfilter mfilter;  private looper mservicelooper;   private servicehandler mservicehandler;     // handler receives messages thread   private final class servicehandler extends handler {       public servicehandler(looper looper) {           super(looper);       }         @override       public void handlemessage(message msg) {           // work here, download file.           // our sample, sleep 5 seconds.              // stop service using startid, don't stop           // service in middle of handling job            if (screenstate==true && (keygaurdmanager.iskeyguardlocked() || keygaurdmanager.iskeyguardsecure())){               log.d("screen on off reciever","screen off(onstartcommand)");               log.d("gaitauthenticationservice", "started recording data");               // each start request, send message start job , deliver               // start id know request we're stopping when finish job               maccelrecorder.onstartbuttonisclicked();                }             // stopself(msg.arg1);       }   }   @override public void oncreate() {      maccelrecorder = new accelrecordertesting();     keygaurdmanager = (keyguardmanager)getsystemservice(context.keyguard_service);     maccelrecorder = new accelrecordertesting(this.getapplicationcontext());     log.i("gaitauthenticationservice", " started");      mfilter = new intentfilter(intent.action_screen_off);     mfilter.addaction(intent.action_screen_on);     registerreceiver(screenonoffreceiver, mfilter);       // start thread running service.  note create     // separate thread because service runs in process's     // main thread, don't want block.  make     // background priority cpu-intensive work not disrupt our ui.     handlerthread thread = new handlerthread("servicestartarguments",new process().thread_priority_background);     thread.start();      // handlerthread's looper , use our handler     mservicelooper = thread.getlooper();     mservicehandler = new servicehandler(mservicelooper); } @suppresslint("newapi") @override public int onstartcommand(intent intent, int flags, int startid) {         // service starting, due call startservice() //  if(intent!=null){         //screenonoffreceiver = new screenoffbroadcastreciever();           screenstate   = intent.getbooleanextra("screen_state",screenoff);         // each start request, send message start job , deliver         // start id know request we're stopping when finish job         message msg = mservicehandler.obtainmessage();         msg.arg1 = startid;         if (screenstate){         mservicehandler.sendmessage(msg);         }           if(screenstate == false){               log.d("screen on off reciever","screenon(onstartcommand)");               try {                   maccelrecorder.onstopbuttonisclicked(true);               } catch (interruptedexception e) {                   // todo auto-generated catch block                   e.printstacktrace();               } catch (illegalargumentexception e) {                   // todo auto-generated catch block                   e.printstacktrace();               } catch (filenotfoundexception e) {                   // todo auto-generated catch block                   e.printstacktrace();               } catch (ioexception e) {                   // todo auto-generated catch block                   e.printstacktrace();               }               log.d("gaitauthenticationservice", "stop recording data");           }   //  }      return gaitauthenticationservice.start_sticky; }  @override public ibinder onbind(intent intent) {      return null; }  @override public void ondestroy() {     log.i(" gaitauthenticationservice", "service destroyed");     if(screenonoffreceiver!=null){         log.i("screenreciever", "true");         unregisterreceiver(screenonoffreceiver);         screenonoffreceiver=null;     }     super.ondestroy(); } /* (non-javadoc)  * @see android.app.service#onunbind(android.content.intaent)  */ @override public boolean onunbind(intent intent) {     if(screenonoffreceiver!=null){         log.i("screenreciever", "true");         unregisterreceiver(screenonoffreceiver);         screenonoffreceiver = null;     }      return super.onunbind(intent); } 

}

here broadcast reciever

public class screenoffbroadcastreciever extends broadcastreceiver {  private boolean screenoff;  @override public void onreceive(context context, intent intent) {     if(intent!=null){         if ((intent.getaction().equals(intent.action_screen_off))) {                   screenoff = true;          }         if(intent.getaction().equals(intent.action_screen_on)){             screenoff = false;         }      intent = new intent(context, gaitauthenticationservice.class);     i.putextra("screen_state", screenoff);     context.startservice(i);     } } 

}

receiver in androidmanifest.xml

<receiver android:name="screenoffbroadcastreciever" >         <intent-filter>             <action android:name="android.intent.action.boot_completed" />              <action android:name="android.intent.action.screen_off"/>              <action android:name="android.intent.action.screen_on"/>         </intent-filter>     </receiver> 


Comments

Popular posts from this blog

node.js - Mongoose: Cast to ObjectId failed for value on newly created object after setting the value -

[C++][SFML 2.2] Strange Performance Issues - Moving Mouse Lowers CPU Usage -

gradle error "Cannot convert the provided notation to a File or URI" -