本地广播LocalBroadcastManager与Android.support.v4.jar导入

来源:互联网 发布:深圳有名的公司 知乎 编辑:程序博客网 时间:2024/06/05 16:42

发出的广播只能在应用内部进行传递,广播接收器也只能接收程序内部的广播。这样就不存在系统全局广播的安全性问题。
修改BroadcastTest的MainActivity代码:

public class MainActivity extends Activity {    private IntentFilter intentFilter;    private NetworkChangeReceiver networkChangeReceiver;    private LocalReceiver localReceiver;    private LocalBroadcastManager localBroadcastManager;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        localBroadcastManager = LocalBroadcastManager.getInstance(this);        Button button = (Button) findViewById(R.id.button);        button.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                //Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");                Intent intent = new Intent("com.example.broadcasttest." +                        "LOCAL_BROADCAST");                localBroadcastManager.sendBroadcast(intent);            }        });        intentFilter = new IntentFilter();        intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");        localReceiver = new LocalReceiver();        localBroadcastManager.registerReceiver(localReceiver, intentFilter);        localBroadcastManager.unregisterReceiver(localReceiver);    }    class LocalReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            Toast.makeText(context, "received LOCAL broadcast",                    Toast.LENGTH_SHORT).show();        }    }}

这里还牵扯到一个导入工具包的问题,LocalBroadcastManager需要android-support-v4.jar才能够使用。网上给的解决方法大都是这样的:
首先在Project->properties->Java Build Path->Libraries->Add External Jars中加入sdk目录下的extras/android/support/v4/android-support-v4.jar(如果找不到,则需要 用sdk manager下载android support package)。加入这个jar包之后就可以使用ViewPager类了。
解决问题
但是再运行logcat仍然一大片红:

08-07 02:52:34.234: W/dalvikvm(706): VFY: unable to find class referenced in signature (Landroid/support/v4/content/LocalBroadcastManager;)08-07 02:52:34.344: I/dalvikvm(706): Could not find method android.support.v4.content.LocalBroadcastManager.getInstance, referenced from method com.example.broadcasttest.MainActivity.onCreate08-07 02:52:34.395: W/dalvikvm(706): VFY: unable to resolve static method 12: Landroid/support/v4/content/LocalBroadcastManager;.getInstance (Landroid/content/Context;)Landroid/support/v4/content/LocalBroadcastManager;08-07 02:52:34.395: D/dalvikvm(706): VFY: replacing opcode 0x71 at 0x000808-07 02:52:34.434: I/dalvikvm(706): Could not find method android.support.v4.content.LocalBroadcastManager.unregisterReceiver, referenced from method com.example.broadcasttest.MainActivity.onDestroy08-07 02:52:34.434: W/dalvikvm(706): VFY: unable to resolve virtual method 15: Landroid/support/v4/content/LocalBroadcastManager;.unregisterReceiver (Landroid/content/BroadcastReceiver;)V08-07 02:52:34.474: D/dalvikvm(706): VFY: replacing opcode 0x6e at 0x000708-07 02:52:34.824: D/AndroidRuntime(706): Shutting down VM08-07 02:52:34.824: W/dalvikvm(706): threadid=1: thread exiting with uncaught exception (group=0x409961f8)08-07 02:52:34.834: E/AndroidRuntime(706): FATAL EXCEPTION: main08-07 02:52:34.834: E/AndroidRuntime(706): java.lang.NoClassDefFoundError: android.support.v4.content.LocalBroadcastManager08-07 02:52:34.834: E/AndroidRuntime(706):  at com.example.broadcasttest.MainActivity.onCreate(MainActivity.java:33)08-07 02:52:34.834: E/AndroidRuntime(706):  at android.app.Activity.performCreate(Activity.java:4465)08-07 02:52:34.834: E/AndroidRuntime(706):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)08-07 02:52:34.834: E/AndroidRuntime(706):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)08-07 02:52:34.834: E/AndroidRuntime(706):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)08-07 02:52:34.834: E/AndroidRuntime(706):  at android.app.ActivityThread.access$600(ActivityThread.java:122)08-07 02:52:34.834: E/AndroidRuntime(706):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)08-07 02:52:34.834: E/AndroidRuntime(706):  at android.os.Handler.dispatchMessage(Handler.java:99)08-07 02:52:34.834: E/AndroidRuntime(706):  at android.os.Looper.loop(Looper.java:137)08-07 02:52:34.834: E/AndroidRuntime(706):  at android.app.ActivityThread.main(ActivityThread.java:4340)08-07 02:52:34.834: E/AndroidRuntime(706):  at java.lang.reflect.Method.invokeNative(Native Method)08-07 02:52:34.834: E/AndroidRuntime(706):  at java.lang.reflect.Method.invoke(Method.java:511)08-07 02:52:34.834: E/AndroidRuntime(706):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)08-07 02:52:34.834: E/AndroidRuntime(706):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)08-07 02:52:34.834: E/AndroidRuntime(706):  at dalvik.system.NativeStart.main(Native Method)08-07 02:52:49.535: I/Process(706): Sending signal. PID: 706 SIG: 9

弄了半天终于发现了原因,你用上边方法导入是,android.supprt.v4.jar是放在了自动创建的一个文件夹Referenced Libraries,这样导入是没有用的。应该手动在项目中创建一个libs文件夹,并把android.supprt.v4.jar粘贴到文件夹中,启动程序——完美。

好了,解决完这个问题,下面分析代码:
可以看出局部广播与动态全局广播类似。只不过现在是通过LocalBroadcastManager的getInstance方法来获取实例,之后加入意图,发送广播。
注册的时候同样使用intentFilter来筛选要接收的广播,然后使用LocalBroadcastManager调用方法registerReceiver来注册。最后用完了之后在onDestroy方法中进行注销。
另外同样需要一个广播接收器内部类,重写他的onReceive方法。

0 0
原创粉丝点击