简体   繁体   中英

correct way of registering broadcast receiver android

In my android application, I am registering multiple broadcast receiver that includes: WiFi, Screen and Activity. The app is running smoothly on Moto g and Samsung G3 but its stopped sensing Screen on/off, Wifi connect/disconnect and Activity events on another phone after three days of smooth execution. Since app is on user phone, i dont know the model/make. Other than event sensing, the usual location sensing is working fine (which is scheduled after every 10 mins). Any ideas what could be wrong? Otherwise, on my test devices it still runs fine (testing for more then 2 weeks). For reference, below is the code for screen sensor only. Also, I tried to register receiver in onstartcommand, but it didn't work on my test devices (See the commented part in screenService)

MainActivity:

Intent intentscreen = new Intent(getApplicationContext(), ScreenService.class);
startService(intentscreen);

ScreenService:

    private final BroadcastReceiver mybroadcast = new ScreenReceiver();
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        /* if (intent!=null)
        {
            IntentFilter screenStateFilter = new IntentFilter();
            screenStateFilter.addAction(Intent.ACTION_SCREEN_ON);
            screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
            registerReceiver(mybroadcast, screenStateFilter);
        }*/
        return START_STICKY;
    }
    @Override
    public void onCreate (){
        super.onCreate();

        IntentFilter screenStateFilter = new IntentFilter();
        screenStateFilter.addAction(Intent.ACTION_SCREEN_ON);
        screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
        registerReceiver(mybroadcast, screenStateFilter);
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();
        unregisterReceiver(mybroadcast);
     }
}

ScreenReceiver:

public class ScreenReceiver extends BroadcastReceiver {

       @Override
       public void onReceive(Context context, Intent intent) {
           if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
               Log.i("Check","Screen went OFF");
            } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                Log.i("Check","Screen went ON");

       }
    }

These BroadcastReceivers have to be registered dynamically

android.intent.action.SCREEN_ON
android.intent.action.SCREEN_OFF
android.intent.action.BATTERY_CHANGED
android.intent.action.CONFIGURATION_CHANGED
android.intent.action.TIME_TICK

EDIT: MainActivity.java package com.kishore_kumar.stackoverflow;

import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

BroadcastReceiver mybroadcast;
IntentFilter screenStateFilter;
static boolean alreadyListening = false; 
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mybroadcast = new ScreenBroadcastReceiver();
    screenStateFilter = new IntentFilter();
    screenStateFilter.addAction(Intent.ACTION_SCREEN_ON);
    screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
If (!alreadyListening)
{
    registerReceiver(mybroadcast, screenStateFilter);
alreadyListening = true;
}


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
}

ScreenBroadcastReceiver.java

package com.kishore_kumar.stackoverflow;


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;


public class ScreenBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
        Log.e("Check", "Screen went OFF");
    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
        Log.e("Check","Screen went ON");
    }
}
}

You can do this way:

Define Receiver in manifest file:

<receiver android:name=".ScreenOnOffListener" >
   <intent-filter>
     <action android:name="android.intent.action.SCREEN_OFF" />
     <action android:name="android.intent.action.SCREEN_ON" />
    </intent-filter>
</receiver>

Now add class which extends BroadcastReceiver :

public class ScreenOnOffListener extends BroadcastReceiver {

       @Override
       public void onReceive(Context context, Intent intent) {
           if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
               Log.i("Check","Screen OFF");
            } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                Log.i("Check","Screen ON");
            }
    }

Hope this will help you.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM