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(参数栏);
//…使用此意图和参数执行任何您想执行的操作。。。
}
}
}
}