Android 类中类广播的静态注册方法
静态注册和动态注册其中的一个区别是 : 动态注册需要所在的activity或者service被创建后才能够被注册,静态注册不需要activity和service启动就可以注册,并且即使activity和service没有启动,也可以接受广播,但是动态却不行.
该文解决的问题点是,在一个没有启动的activity或者service中存在一个继承BroadcastReceiver内中内类,这个类将如何静态注册.
给出一个demo:
启动的第一个activity类:
package com.example.androidbroadcastdemo; import android.os.Bundle; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.util.Log; import android.view.Menu; import android.widget.Toast; public class MainActivity extends Activity { private final String TAG="mainactivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); IntentFilter ii=new IntentFilter(); ii.addAction("com.tf.ACTION"); // MainActivity.this.registerReceiver(mb, ii); MainActivity.this.registerReceiver(mb, new IntentFilter("com.tf.ACTION")); IntentFilter ih=new IntentFilter(); ih.addAction("com.tf.ACTIONS"); MainActivity.this.registerReceiver(mbn, new IntentFilter("com.tf.ACTIONS")); Intent i=new Intent(this,receiverget.class); this.startActivity(i); } @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; } public BroadcastReceiver mb=new BroadcastReceiver(){ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub // Toast.makeText(getApplicationContext(), "get broadcast msg : "+intent.getAction()+"///"+intent.getStringExtra("msg"), Toast.LENGTH_LONG).show(); Log.i(TAG,"get information ."); } }; public BroadcastReceiver mbn=new BroadcastReceiver(){ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), "get broadcast msg : "+intent.getAction()+"///"+intent.getStringExtra("msg"), Toast.LENGTH_LONG).show(); Log.i(TAG,"get information ."); } }; }
下面是另外两个activity,也可以自行改为service,只是在启动的时候把startActivity方法改为startService方法就可以了.
package com.example.androidbroadcastdemo; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.AttributeSet; import android.view.View; public class receiverget extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); Intent i=new Intent(); i.putExtra("msg", "yes"); i.setAction("com.tf.ACTION"); this.sendBroadcast(i); Intent in=new Intent(); in.putExtra("msg", "no"); in.setAction("com.tf.ACTIONS"); this.sendBroadcast(in); } @Override public View onCreateView(String name, Context context, AttributeSet attrs) { // TODO Auto-generated method stub return super.onCreateView(name, context, attrs); } }
第三个:内部类用静态的static声明,并且类中不能够使用非静态或者主类中的变量,可能是由于主类没有创建,而这时收到广播,就会报出变量未声明之类的错误.
package com.example.androidbroadcastdemo; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.widget.Toast; public class act03 extends Activity{ private final String TAG="ACT003"; private static Context mContext; @Override public void finish() { // TODO Auto-generated method stub super.finish(); } @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); ActBroadcastReceiver m=new ActBroadcastReceiver(); } @Override public View onCreateView(String name, Context context, AttributeSet attrs) { // TODO Auto-generated method stub mContext=context; return super.onCreateView(name, context, attrs); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); } public static class ActBroadcastReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Log.i("ACT03","**************************************"); } } }
下面是AndroidManifest.xml文件的配置:这个文件中的写法,主类和内部类的写法
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.androidbroadcastdemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <receiver android:name=".act03$ActBroadcastReceiver"> <intent-filter > <action android:name="com.tf.ACTION"/> </intent-filter> </receiver> <activity android:name="com.example.androidbroadcastdemo.MainActivity" android:process=":sipStack" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.example.androidbroadcastdemo.receiverget" android:label="@string/app_name" > </activity> <activity android:name="com.example.androidbroadcastdemo.act03" android:process=":sip" android:label="@string/app_name" > </activity> </application> </manifest>
布局文件只是增加了一个按钮:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView1" android:layout_marginLeft="14dp" android:layout_marginTop="98dp" android:layout_toRightOf="@+id/textView1" android:text="send" /> </RelativeLayout>
运行既可以看到内中类收到广播,并且用Toast显示出来.......................

浙公网安备 33010602011771号