PS:不断提升自己,是件好事...
广播接收者,用来接收系统和应用中的广播...Android广播机制用的地方还是很多的,比如说:当网络状态发生改变的时候,通过接收这条广播就能及时做出相应的响应,然后完成一些操作..这就是广播的机制...它自身并不实现图形用户界面...只是一个触发性的操作...
i.那就是建立一个类来实现一个广播,再类中定义响应的方法...来完成一些响应的操作...
一种是静态注册,静态注册就是配置AndroidManifest.xml文件进行配置,由系统管理receiver,属于常驻型的...
<!--这段代码添加在application之间就可以了。。。--> <receiver android:name=".MyBroadcast" android:enabled="true"> <intent-filter> <action android:name="android.intent.action.EDIT"/> </intent-filter> </receiver>
二种则是动态注册...属于非常驻型的,并且隐藏在代码块之间...不容易发现...
private BroadcastReceiver receiver; receiver=new CallReceiver(); //动态注册广播地址... registerReceiver(receiver,new IntentFilter("android.intent.action.EDIT")); //解除注册的广播地址,一定要对广播机制进行注销... unregisterReceiver(receiver);
iii.注册完成后就是进行发送广播了...这样广播接收者就可以正常工作了...先构建一个Intent对象,然后调用sendBroadcast(Intent)方法将广播发出...
还有一点就是,对象调用了onReceive()方法时广播才是有效的,当从这个函数返回之后,这个对象就无效了..因此 广播的生命周期是非常短暂的, 也就仅仅十几秒的生命周期,因此不要在其中加入一些耗时的操作,耗时的操作可以交给Service去完成,广播就是完成一些非常小的操作就可以了...粘一个代码...
package com.example.broadcast_receiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class MyBroadcast extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String str=intent.getStringExtra("msg"); Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); } }
上面就是定义一个广播接收类,它继承于BroadcastReceiver,在其中完成一些相应的操作....
package com.example.broadcast_receiver; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.content.Intent; public class MainActivity extends Activity implements View.OnClickListener { private Intent intent=new Intent(Intent.ACTION_EDIT); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.broadcast).setOnClickListener(this); } @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; } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.broadcast: intent.putExtra("msg", "aa"); MainActivity.this.sendBroadcast(intent); break; } } }
这个就是如何在MainActivity中调用广播接收者,很简单的一个动作,就是触发按钮,然后会在屏幕上输出"aa"这条信息...很简单的一个操作,布局文件就一个按钮,没必要去粘贴...重要的是理解一下这个过程,不要忘了使用BroadcastReceiver时一定要进行注册,否则是不能进行使用的....
前面已经说过,BroadcastReceiver对象的生命周期是非常短暂的...那么耗时的动作是无法在这里执行的,但是我们可以在BroadcastReceiver中去调用Service...让Service去执行耗时的服务...简单的介绍一下如何去启动Service...
package com.example.broadcast_receiver; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.IBinder; public class MyService extends Service{ private MediaPlayer media; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate(){ super.onCreate(); media=MediaPlayer.create(MyService.this, R.raw.a); MyService.this.media.prepare(); MyService.this.media.start(); media.setLooping(true); } @Override public void onDestroy(){ super.onDestroy(); } @Override public void onStart(Intent intent,int startId){ super.onStart(intent, startId); } }
这里我们需要复制一首歌曲到res/raw文件夹下一首歌曲...raw文件夹我们自己进行新建...
package com.example.broadcast_receiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class MyBroadcast extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Intent newintent =new Intent(context,MyService.class); context.startService(newintent); String str=intent.getStringExtra("msg"); Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); } }
这个是广播类,从广播的内部去启动Service.....然后在AndroidManifest.xml文件中的<application>和</application>之间加入代码<service android:name=".MyService" android:enable="true"/>就搞定了...