-1

I start a service from activity button click that fire a service class and start Broadcastreceiver and it's run in background but I want to unregisterReceiver with a button click from same activity class.it seem not working.I added receiver class to menifest. Here is my code.

Activity button click for registerreceiver

save.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent svc = new Intent(this, DemoService.class);
        startService(svc);
    });

DemoService.class

public class DemoService extends Service {
   static final String LOGGING_TAG = "MyDemo";
   private static Alarm1 tickReceiver =new Alarm1();

   @Override
   public IBinder onBind(Intent intent) {
       return null;
   }

   @Override
   public void onStart(Intent intent, int startId){
       super.onStart(intent, startId);
       Log.v(LOGGING_TAG, "DemoService.onStart()");
   }

   @Override
   public void onCreate(){
       super.onCreate();
       Log.d(LOGGING_TAG, "DemoService.onCreate()");

       registerReceiver(
            new Alarm1(),
            new IntentFilter(Intent.ACTION_TIME_TICK));
   }
}

Activity button click for unregisterReceiver

unreg.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           DemoService demo=new DemoService();
          demo.unreg();
    });

And receiver class

public class Alarm1 extends BroadcastReceiver {

   @Override
   public void onReceive(Context context, Intent intent) {
     Log.d("tag","working");
   }

How can I unregisterReceiver from unreg button click. If I click in unreg button it show me error java.lang.IllegalArgumentException: Receiver not registered:

shakac
  • 379
  • 4
  • 15
  • if it's locally purpose you should use LocalBroadcastReceiver. Did you see this: http://stackoverflow.com/questions/8241128/dynamically-register-unregister-a-broadcast-receiver-in-android It may help you – Krzysztof Turek Nov 10 '16 at 05:54
  • my app will be run in background.so i can not use onpause method to unregister.@KrzysztofTurek – shakac Nov 10 '16 at 06:00
  • could you show me your unreg() method in DemoService? I see that you have tickerReceiver reference, but in onCreate method you create new one 'registerReceiver( new Alarm1(), new IntentFilter(Intent.ACTION_TIME_TICK));' – Krzysztof Turek Nov 10 '16 at 06:06
  • public void unreg(){this.unregisterReceiver(tickreceiver)} @KrzysztofTurek – shakac Nov 10 '16 at 06:13
  • so it can't work because you register "newAlarm1()" instead of register(tickreveiver,...). That's why you see "java.lang.IllegalArgumentException: Receiver not registered:" – Krzysztof Turek Nov 10 '16 at 06:58
  • i registerReceiver in onCreate method.see demoService.class in unregister it now give me null pointer exception @KrzysztofTurek – shakac Nov 10 '16 at 07:17

3 Answers3

1

create a method for unregistering Receiver in Service class. And call the service with action like.

Intent svc = new Intent(this, DemoService.class);
 svc.setAction("com.package.UN_REGISTER"); 
 startService(svc);

and in Service class handle them in onStartCommand ()

like

if(intent.getAction().equals("com.package.UN_REGISTER")
    //call your unregister method

Add action in Manifest in your service Tag

<IntentFilter> 
  <action name = "com.package.UN_REGISTER">
</IntentFilter>
Zar E Ahmer
  • 33,936
  • 20
  • 234
  • 300
  • hi if i try to register with button click with your code it give me null pointer exception my edited code @Override public int onStartCommand(Intent intent, int flags, int startId) { f(intent.getAction().equals("com.package.UN_REGISTER")) { unreg(); } return super.onStartCommand(intent, flags, startId); } public void unreg() { unregisterReceiver(new Alarm1()); } – shakac Nov 10 '16 at 08:16
  • it's now give me illegalargument exception java.lang.RuntimeException: Unable to start service com.kotha.bola.ghori.DemoService@4315e990 with Intent { act=com.package.UN_REGISTER cmp=com.kotha.bola.ghori/.DemoService }: java.lang.IllegalArgumentException: Receiver not registered: com.kotha.bola.ghori.Alarm1@4316f Nepster – shakac Nov 10 '16 at 13:58
  • Ah at last i figure out what's problem and solve it.i just instantiate receiver class in onStart method in service class.thanks everyone for there effort. – shakac Nov 10 '16 at 14:21
0

You should use Bound Services for this. Check link for implementation and usage

Vygintas B
  • 1,624
  • 13
  • 31
0

If you want to correctly register and unregister a BroadcastReceiver. The BroadcastReceiver passed in registerReceiver() and unregisterReceiver() must be the same instance, so is the Context instance be invoked. Because the implement uses Context and BroadcastReceiver instances to uniquely map to a "Register operation".

huangjh
  • 46
  • 4