Why my BroadcastReceiver doesn't work?

2019-06-08 01:55发布

I'm trying to learn to use Android BroadcasReceiver. I wrote this code but It doesn't work... I tryed for example to change the Time etc... What is it wrong?

I added in the Manifest:

<receiver android:name="com.example.broadcastreceiverspike.Broadcast" >
        <intent-filter android:priority="100">
            <action android:name="android.intent.action.ACTION_SCREEN_ON" />
            <action android:name="android.intent.action.ACTION_SCREEN_OFF" />
            <action android:name="android.intent.action.TIME_SET" />
        </intent-filter>
</receiver>

My simple BroadcasReceiver:

    public class Broadcast extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
           Log.d("BROADCAST", "It worked");
           Toast.makeText(context, "BROADCAST",  Toast.LENGTH_LONG).show();
        }
}

My Main Activity (default main Activity)

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

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

}

4条回答
淡お忘
2楼-- · 2019-06-08 02:04

I had the same problem and I fixed it (tested on 4.3 and 5.1). I WAS able to declare "android.intent.action.USER_PRESENT" inside the manifest, as long as you have the READ_PHONE_STATE permission, it is OK!! My mini app consists of a Broadcast receiver that reacts to the screen ON/OFF state, and runs a background service that does continuous voice recognition. If the screen is off, the recognition is turned off. Here is the code, enjoy: MANIFEST:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <receiver android:name="classes.VoiceLaunchReceiver" >
            <intent-filter>                
                <action android:name="android.intent.action.USER_PRESENT" />    
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

BROADCAST RECEIVER:

public class VoiceLaunchReceiver extends BroadcastReceiver {
    @Override  
    public void onReceive(Context ctx, Intent intent) {     
        Intent service = new Intent(ctx, VoiceLaunchService.class);
     //   service.putExtra(action, true);
        Log.i("joscsr","Incoming Voice Launch Broadcast...");  

        if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) {
            Log.i("joshcsr", "************\nCSR Resumed (BC)\n************");
            ctx.startService(service);
            }
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            Log.i("joshcsr", "************\nCSR STOPPED by SCREEN (BC)\n************");
            ctx.stopService(service);  
            }
        }  
}

As you can imagine, my USER_PRESENT broadcast receiver is not registered anywhere else. I do register ACTION_SCREEN_OFF and ON in the onCreate method of my service, who was triggered by my receiver.

@Override
public void onCreate() {
    super.onCreate();
    //Register screen ON/OFF BroadCast
    launcher=new VoiceLaunchReceiver();
    IntentFilter i=new IntentFilter(Intent.ACTION_SCREEN_OFF);
    i.addAction(Intent.ACTION_SCREEN_ON);               
    registerReceiver(launcher,i);
    Log.d("joshcsr","VoiceLaunch Service CREATED"); 
    }

Finally I unregister the screen on/off in the onDestroy() of my service:

@Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(launcher);}
查看更多
不美不萌又怎样
3楼-- · 2019-06-08 02:06

Check out this tutorial about broadcast receivers.

Update: I'm not sure you're using this tutorial, because there are lots of useful stuff in this tutorial, like this:

@Override
public void onResume() {
    super.onResume();

    // Register mMessageReceiver to receive messages.
    LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
        new IntentFilter("my-event"));
    }

    // handler for received Intents for the "my-event" event 
    private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
        // Extract data included in the Intent
        String message = intent.getStringExtra("message");
        Log.d("receiver", "Got message: " + message);
    }
};

@Override
protected void onPause() {
    // Unregister since the activity is not visible
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
    super.onPause();
} 

In other words, you've created a custom broadcast receiver class, but you haven't used it.

And also please check this.

查看更多
趁早两清
4楼-- · 2019-06-08 02:08

I solved!

"unlike other broad casted intents, for Intent.ACTION_SCREEN_OFF and Intent.ACTION_SCREEN_ON you CANNOT declare them in your Android Manifest! I’m not sure exactly why, but they must be registered in an IntentFilter in your JAVA code"

http://thinkandroid.wordpress.com/2010/01/24/handling-screen-off-and-screen-on-intents/

Manifest

    <receiver android:name=".Broadcast" >
        <intent-filter>                
            <action android:name="android.intent.action.TIME_SET" />

        </intent-filter>
    </receiver>

Main Activity Class

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

     // INITIALIZE RECEIVER
    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    BroadcastReceiver mReceiver = new Broadcast();
    registerReceiver(mReceiver, filter);

}

}

My broadcast receiver

public class Broadcast extends BroadcastReceiver {

public static String TAG = "BROADCAST";

@Override
public void onReceive(Context context, Intent intent) {

    if (intent.getAction().equals(Intent.ACTION_TIME_CHANGED))
    {
        Log.d(TAG, "BROADCAST Cambio di orario");
        Toast.makeText(context, "BROADCAST Cambio di orario", Toast.LENGTH_LONG).show();
    }
    else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
        // DO WHATEVER YOU NEED TO DO HERE
        Log.d(TAG, "BROADCAST Screen OFF");
        Toast.makeText(context, "Screen OFF", Toast.LENGTH_LONG).show();
    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
        // AND DO WHATEVER YOU NEED TO DO HERE
        Log.d(TAG, "BROADCAST Screen ON");
        Toast.makeText(context, "BROADCAST Screen ON", Toast.LENGTH_LONG).show();
    }
}

}

查看更多
ゆ 、 Hurt°
5楼-- · 2019-06-08 02:10

Did you add the needed premissions?

uses-permission android:name="android.permission.READ_PHONE_STATE"

This is a receiver to handle when screen is off or on or locked:

public class ScreenReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent)
{
    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF))
    {   



    }
    else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON))
    {


    }
    else if(intent.getAction().equals(Intent.ACTION_USER_PRESENT))
    {

    }

}

} this is the manifest:

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

        </intent-filter>
    </receiver>
查看更多
登录 后发表回答