我想在我的应用中添加自定义广播接收器。我有3种方法可以进行广播。在我的onReceive方法中,我想确定哪个方法进行了广播。我有3个像这样的方法
public void method01(View v){
int flag = 1;
Intent intent = new Intent();
intent.addFlags(flag);
broadcastIntent(intent);
}
public void method02(){
int flag = 2;
Intent intent = new Intent();
intent.addFlags(flag);
broadcastIntent(intent);
}
public void method03(){
int flag = 3;
Intent intent = new Intent();
intent.addFlags(flag);
broadcastIntent(intent);
}
这是我的broadcastIntent方法
public void broadcastIntent(Intent intent){
sendBroadcast(intent);
}
在我的onReceive方法中,我使用getFlags()方法从intent中获取标志值,并通过if,else发送它。但这不起作用。欢迎任何改进建议。
答案 0 :(得分:2)
第一个问题是ypu没有为你的意图指定目标。您可以使用意图过滤器和rodkarom建议的操作,或直接指定接收者的类(参见我的示例)。在这两种情况下,您都需要在AndroidManifest.xml中声明您的广播接收器,或在运行时注册它(请参阅rodkarom的答案以获取样本)。
方法addFlags
用于指定Intent的某些内部属性(如新任务中与此intent相对应的start活动),因此您无法将其用于自己的数据。可能的标志列表在setFlags方法的文档中。
您可以使用putExtra来实现目标:
// an Activity is just an example
public class SenderActivity extends Activity {
// ...
void method01() {
int flag = 1;
Intent intent = new Intent(getApplicationContext(), Receiver.class); // any Context is acceptable here
intent.putExtra(MyReceiver.EXTRA_FLAG, flag); // any string will do well, you just need it to be the same here and in getExtra later
sendBroadcast(intent);
}
}
public class MyReceiver extends BroadcastReceiver {
public static final String EXTRA_FLAG = "your.package.name.EXTRA_FLAG";
// and in onReceive
public void onReceive (Context context, Intent intent) {
int flag = intent.getIntExtra(EXTRA_FLAG, someDefaultValue);
if (flag == 1) {
// ...
}
// ...
}
}
答案 1 :(得分:2)
您还可以使用操作来识别每个Intent对象。
String action1 = "first_sender";
String action2 = "second_sender";
Intent createIntent01(){
Intent intent01 = new Intent();
intent01.setAction(action1);
return intent01;
}
Intent createIntent02(){
Intent intent02 = new Intent();
intent01.setAction(action2);
return intent02;
}
在您的onReceive
方法中,您可以使用getAction()
意图方法来检查已发送的操作。这是为了你还没有使用动作。
<强> [[编辑]] 强>
要注册BroadcastReceiver
,您需要定义IntentFilter
并注册您希望以这种方式接收的操作:
mBroadcastReceiver broadcastReceiver = new mBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(action1);
intentFilter.addAction(action2);
registerReceiver(broadcastReceiver,intentFilter);
class mBroadcastReceiver extends BroadcastReceiver{
public void onReceive(Context arg0, Intent arg1){
String action = arg1.getAction();
if(action.equals(action1)){
//do something
}else if(action.equals(action2)){
//do something else
}
}
答案 2 :(得分:2)
我找到了解决这个问题的方法并想到了共享代码。这是我在两个不同方法的主要活动中完成的广播。
public void method1(View view){
Intent intent = new Intent();
intent.setAction("method1");
sendBroadcast(intent);
}
public void method2(View view){
Intent intent = new Intent();
intent.setAction("method2");
sendBroadcast(intent);
}
这就是我收到它的方式..
public class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Broadcast Intent Detected.",Toast.LENGTH_LONG).show();
}
这是我在清单上注册的方式。
<receiver android:name="Receiver" >
<intent-filter>
<action android:name="method1" >
</action>
<action android:name="method2" >
</action>
</intent-filter>
</receiver>
希望如果其他任何人遇到类似的问题,这将有所帮助。非常感谢每一个在这里发表答案的人。