Android:如何使用switch case处理从广播接收到的意图
我想分析从广播接收到的意图。因为不同的广播可能有不同的意图。为了评估不同的广播,我想使用如下的Android:如何使用switch case处理从广播接收到的意图,android,android-intent,broadcastreceiver,android-broadcast,Android,Android Intent,Broadcastreceiver,Android Broadcast,我想分析从广播接收到的意图。因为不同的广播可能有不同的意图。为了评估不同的广播,我想使用如下的切换案例语句: public void onReceive(Context context, Intent intent) { switch (intent.getAction()) { case Intent.ACTION_SCREEN_OFF: //code for this intent } } 但是我知道不可能创建这样的switch case语句,所以我
切换案例
语句:
public void onReceive(Context context, Intent intent) {
switch (intent.getAction()) {
case Intent.ACTION_SCREEN_OFF:
//code for this intent
}
}
但是我知道不可能创建这样的switch case语句,所以我想我需要一个类似于整数值的东西来标识意图,但是我找不到一个方法来从我的意图中获取这样的值
谁能告诉我如何用开关箱语句分析不同的意图
编辑:如果
,则与else一起工作,但我想使用开关大小写
所有意图。操作字段是字符串常量
在android使用JDK 6或5编译之前,不能使用带字符串的开关。所以你不能在Android上使用这种方法
但是如果
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF) {
// Do
} else if (intent.getAction().equals(Intent.ANYTINGS) {
//do
}
所有意图.动作*字段都是字符串常量
在android使用JDK 6或5编译之前,不能使用带字符串的开关。所以你不能在Android上使用这种方法
但是如果
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF) {
// Do
} else if (intent.getAction().equals(Intent.ANYTINGS) {
//do
}
我也想使用switch case语句。
因此,我创建了自定义枚举类,其构造函数需要如下所示的意图操作字符串:
(因为enum可用于switch case语句) 使用示例:
// trigger it.
ACTION.FOO.broadcast(context,new PARAM.Abstract());
...
// receive & handle it.
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
ACTION anEnum = ACTION.getEnum(action);
switch (anEnum) {
case INVALID: // it can be occured by old version's legacy alarm.
Log.w("INVALID action occured:"+action);
break;
case FOO:
// do something for FOO
break;
case BAR:
// do something for FOO
break;
defalut:
Log.d("Unimplement! action:"+action);
break;
}
}
...
// and I recommend below, when register broadcast receiver.
// create this method below of onReceive.
private IntentFilter getIntentFilter() {
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION.FOO.getAction());
filter.addAction(ACTION.BAR.getAction());
return filter;
}
...
// register your receiver like this
BroadcastReceiver my = new MyBroadcastReceiver();
registerReceiver(my, my.getIntentFilter());
解释PARMA.Abstrat使用enum广播很方便。
它减少了键入代码(
}或者if(action.equals(“blahblah”){
)和声明操作(静态最终操作_FOO=“action.FOO”
)等工作。但是..当您需要添加一些额外内容以向其他组件发送某些内容时,您会发现无法执行类似
ACTION.FOO.broadcastWithParam(p);
。即使您在FOO
上实现了broadcastWithParam()
,您也无法访问方法broadcastWithParam()
。因为枚举就是这样工作的。(详情请参见)
所以我们需要用另一种方式。
在我的情况下,我决定使用class(PARAM
)。声明:
class PARAM {
public static class Abstract {
protected void injectExtras(Intent intent){
// do nothing for action don't need to extas...
}
}
public static class FOO extends Abstract { // this is for ACTION.FOO
public static final String P1_KEY="p1";
public static final String P2_KEY="p2";
String p1;
int p2;
public FOO(String p1, int p2){
this.p1 =p1;
this.p2 =p2;
}
@Override
protected void injectExtras(Intent intent){
intent.putExtra(P1_KEY,this.p1);
intent.putExtra(P2_KEY,this.p2);
}
}
public static class BAR extends Abstract{ // this is for ACTION.BAR
...
}
}
使用示例:
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
ACTION anEnum = ACTION.getEnum(action);
switch (anEnum) {
case FOO:
Bundle extras = intent.getExtras();
String p1 = extras.getString(PARAM.FOO.P1_KEY);
int p2 = extras.getString(PARAM.FOO.P2_KEY);
// do something with p1 & p2;
break;
}
}
最后,
我使用“ACTION&
PARAM`作为服务的内部类,BroadcastReceiver或其他。例如:
public class MyIntentService extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
final String action = intent.getAction();
ACTION anEnum = ACTION.getEnum(action);
switch (anEnum) {
case INVALID: // it can be occured by old version's legacy alarm.
Log.w("INVALID action occured:"+action);
break;
case FOO:
// do something for FOO
break;
case BAR:
// do something for FOO
break;
defalut:
Log.d("Unimplement! action:"+action);
break;
}
}
}
public static enum ACTION {...}
public static class PARAM {...}
}
我也想使用switch case语句。
因此,我创建了自定义枚举类,其构造函数需要如下所示的意图操作字符串:
(因为enum可用于switch case语句) 使用示例:
// trigger it.
ACTION.FOO.broadcast(context,new PARAM.Abstract());
...
// receive & handle it.
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
ACTION anEnum = ACTION.getEnum(action);
switch (anEnum) {
case INVALID: // it can be occured by old version's legacy alarm.
Log.w("INVALID action occured:"+action);
break;
case FOO:
// do something for FOO
break;
case BAR:
// do something for FOO
break;
defalut:
Log.d("Unimplement! action:"+action);
break;
}
}
...
// and I recommend below, when register broadcast receiver.
// create this method below of onReceive.
private IntentFilter getIntentFilter() {
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION.FOO.getAction());
filter.addAction(ACTION.BAR.getAction());
return filter;
}
...
// register your receiver like this
BroadcastReceiver my = new MyBroadcastReceiver();
registerReceiver(my, my.getIntentFilter());
解释PARMA.Abstrat使用enum广播很方便。
它减少了键入代码(
}或者if(action.equals(“blahblah”){
)和声明操作(静态最终操作_FOO=“action.FOO”
)等工作。但是..当您需要添加一些额外内容以向其他组件发送某些内容时,您会发现无法执行类似
ACTION.FOO.broadcastWithParam(p);
。即使您在FOO
上实现了broadcastWithParam()
,您也无法访问方法broadcastWithParam()
。因为枚举就是这样工作的。(详情请参见)
所以我们需要用另一种方式。
在我的情况下,我决定使用class(PARAM
)。声明:
class PARAM {
public static class Abstract {
protected void injectExtras(Intent intent){
// do nothing for action don't need to extas...
}
}
public static class FOO extends Abstract { // this is for ACTION.FOO
public static final String P1_KEY="p1";
public static final String P2_KEY="p2";
String p1;
int p2;
public FOO(String p1, int p2){
this.p1 =p1;
this.p2 =p2;
}
@Override
protected void injectExtras(Intent intent){
intent.putExtra(P1_KEY,this.p1);
intent.putExtra(P2_KEY,this.p2);
}
}
public static class BAR extends Abstract{ // this is for ACTION.BAR
...
}
}
使用示例:
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
ACTION anEnum = ACTION.getEnum(action);
switch (anEnum) {
case FOO:
Bundle extras = intent.getExtras();
String p1 = extras.getString(PARAM.FOO.P1_KEY);
int p2 = extras.getString(PARAM.FOO.P2_KEY);
// do something with p1 & p2;
break;
}
}
最后,
我使用“ACTION&
PARAM`作为服务的内部类,BroadcastReceiver或其他。例如:
public class MyIntentService extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
final String action = intent.getAction();
ACTION anEnum = ACTION.getEnum(action);
switch (anEnum) {
case INVALID: // it can be occured by old version's legacy alarm.
Log.w("INVALID action occured:"+action);
break;
case FOO:
// do something for FOO
break;
case BAR:
// do something for FOO
break;
defalut:
Log.d("Unimplement! action:"+action);
break;
}
}
}
public static enum ACTION {...}
public static class PARAM {...}
}
三个月前,我回答了这个问题。现在我有了一个比以前更好的想法 简单地说,您不必在onReceive方法中使用switch语句。 因为有比这更有效的方法。 使用反射使每个意图助手处理自己 请参阅下面的代码:
public class SOReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {INTENT.onHandleIntent(this, intent);}
public static class INTENT {
public static void onHandleIntent(SOReceiver intentService, Intent intent) {
for (Class<?> clazz : INTENT.class.getDeclaredClasses()) {
// note: this code use getSimpleName!
if (clazz.getSimpleName().equals(intent.getAction())) {
try {
IntentInterface instance = (IntentInterface) clazz.newInstance();
instance.onReceive(intentService, intent);
} catch (Exception e) {
e.printStackTrace();
}
return;
}
}
// unexpected INTENT arrived.
}
private static interface IntentInterface {
void onReceive(SOReceiver intentService, Intent intent);
}
public static class EACH_ACTION implements IntentInterface {
// usage ex: SOReceiver.INTENT.EACH_ACTION.start(context,3.0,1);
private static final String PARAM_FOO = "PARAM_FOO";
private static final String PARAM_BAR = "PARAM_BAR";
public static void start(Context context, double foo, int bar) {
Intent intent = new Intent();
intent.setAction(EACH_ACTION.class.getSimpleName()); // necessary
intent.setClass(context, SOReceiver.class); // optional, but recommended.
intent.putExtra(PARAM_FOO,foo);
intent.putExtra(PARAM_BAR,bar);
context.sendBroadcast(intent);
// or if you want to use this as pending intent.
// PendingIntent.getBroadcast(context,0,intent,0);
}
@Override
public void onReceive(SOReceiver intentService, Intent intent) {
Bundle extras = intent.getExtras();
double foo = extras.getDouble(PARAM_FOO);
int bar = extras.getInt(PARAM_BAR);
// ... do what ever you want to do with this intent and parameters ...
}
}
}
}
公共类SOReceiver扩展广播接收器{
@凌驾
public void onReceive(上下文,意图){Intent.onHandleIntent(this,Intent);}
公共静态类意图{
手动内容上的公共静态无效(SOReceiver intentService,Intent Intent){
for(类clazz:INTENT.Class.getDeclaredClasses()){
//注意:此代码使用getSimpleName!
if(clazz.getSimpleName().equals(intent.getAction())){
试一试{
IntentInterface实例=(IntentInterface)clazz.newInstance();
onReceive(intentService,intent);
}捕获(例外e){
e、 printStackTrace();
}
返回;
}
}
//意料之外的意图出现了。
}
专用静态接口IntentInterface{
接收无效(SOReceiver意向服务,意向);
}
公共静态类每个_操作都实现IntentInterface{
//用法示例:SOReceiver.INTENT.EACH_ACTION.start(上下文,3.0,1);
私有静态最终字符串PARAM_FOO=“PARAM_FOO”;
私有静态最终字符串PARAM_BAR=“PARAM_BAR”;
公共静态void开始(上下文、双foo、int-bar){
意图=新意图();
intent.setAction(每个_ACTION.class.getSimpleName());//必要
intent.setClass(context,SOReceiver.class);//可选,但建议使用。
意图.额外支出(参数为FOO,FOO);
意图。额外(参数栏、栏);
发送广播(意图);
//或者,如果您想将此用作挂起的意图。
//getBroadcast(上下文,0,意图,0);
}
@凌驾
接收时公共无效(SOReceiver意向服务,意向){
Bundle extras=intent.getExtras();
double foo=extras.getDouble(PARAM_foo);
int bar=额外的getInt(参数栏);
//…使用此意图和参数执行任何您想执行的操作。。。
}
}
}
}