器(BroadcastReceiver) java
做者:webabcd android
介紹 在 Android 中使用 Activity, Service, Broadcast, BroadcastReceiver 活動(Activity) - 用於表現功能 服務(Service) - 至關於後臺運行的 Activity 廣播(Broadcast) - 用於發送廣播 廣播接收器(BroadcastReceiver) - 用於接收廣播 Intent - 用於鏈接以上各個組件,並在其間傳遞消息 一、演示 Activity 的基本用法,⼀個 Activity 啓動另⼀個 Activity,啓動另⼀個 Activity 時爲其傳遞 參數,被啓動的 Activity 返回參數給啓動者的 Activity Main.java 代碼 package com.webabcd.activity; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; public class Main extends Activity { TextView txt; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.main); txt = (TextView) this.findViewById(R.id.txt); txt.setText("Activity 1"); Button btn = (Button) this.findViewById(R.id.btn); btn.setText("啓動另⼀個Activity"); btn.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { // 實例化 Intent,指定須要啓動的 Activity Intent intent = new Intent(); intent.setClass(Main.this, MyActivity.class); // 實例化 Bundle,設置須要傳遞的參數 Bundle bundle = new Bundle(); bundle.putString("name", "webabcd"); bundle.putDouble("salary", 100.13); // 將須要傳遞的參數賦值給 Intent 對象 intent.putExtras(bundle); // startActivity(intent); // 啓動指定的 Intent(不等待返回結果) // Main.this.finish(); // 啓動指定的 Intent,並等待返回結果 // 其中第二個參數若是大於等於零,則返回結果時會回調 onActivityResult() 方法 startActivityForResult(intent, 0); } }); Log.d("MyDebug", "onCreate"); } // 被啓動的 Activity 返回結果時的回調函數 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK){ Bundle bundle = data.getExtras(); String name = bundle.getString("name"); double salary = bundle.getDouble("salary"); txt.setText("Activity 1" + "\n名字:" + name + "\n薪水:" + String.valueOf(salary)); } } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); Log.d("MyDebug", "onStart"); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); Log.d("MyDebug", "onStop"); } @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); Log.d("MyDebug", "onRestart"); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); Log.d("MyDebug", "onPause"); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Log.d("MyDebug", "onResume"); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.d("MyDebug", "onDestroy"); } } MyActivity.java 代碼 package com.webabcd.activity; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; // 被另⼀個 Activity 所啓動的 Activity public class MyActivity extends Activity { Intent intent; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.main2); // 獲取啓動者傳遞過來的參數 intent = this.getIntent(); Bundle bundle = intent.getExtras(); String name = bundle.getString("name"); double salary = bundle.getDouble("salary"); TextView txt = (TextView) this.findViewById(R.id.txt); txt.setText("Activity 2" + "\n名字:" + name + "\n薪水:" + String.valueOf(salary)); Button btn = (Button) this.findViewById(R.id.btn); btn.setText("返回前⼀個Activity"); btn.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { // 返回參數給啓動者 MyActivity.this.setResult(Activity.RESULT_OK, intent); MyActivity.this.finish(); } }); } } AndroidManifest.xml 代碼 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.webabcd.activity" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Main" 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 ,則都要在這裏作相應的配置 --> <activity android:name=".MyActivity" android:label="Activity 2" /> </application> <uses-sdk android:minSdkVersion="3" /> </manifest> 二、Service, Broadcast, BroadcastReceiver 的演示 Main.java 代碼 package com.webabcd.service; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; /* * startService() 和 bindService() 的區別 * startService() - 正常理解就好 * bindService() - 使當前上下文對象(本例中就是 Activity)經過⼀個 ServiceConnection 對象邦定 到指定的 Service 。這樣,若是上下文對象銷燬了的話,那麼其對應的 Service 也會被銷燬 */ public class Main extends Activity implements OnClickListener { private TextView txtMsg; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setTitle("android 之 service"); this.findViewById(R.id.btnStart).setOnClickListener(this); this.findViewById(R.id.btnStop).setOnClickListener(this); this.findViewById(R.id.btnBind).setOnClickListener(this); this.findViewById(R.id.btnUnbind).setOnClickListener(this); txtMsg = (TextView)this.findViewById(R.id.txtMsg); // 實例化自定義的 BroadcastReceiver receiver = new UpdateReceiver(); IntentFilter filter = new IntentFilter(); // 爲 BroadcastReceiver 指定 action ,使之用於接收同 action 的廣播 filter.addAction("com.webabcd.service.msg"); // 以編程方式註冊 BroadcastReceiver 。配置方式註冊 BroadcastReceiver 的例 子見 AndroidManifest.xml 文件 // ⼀般在 OnStart 時註冊,在 OnStop 時取消註冊 this.registerReceiver(receiver, filter); // this.unregisterReceiver(receiver); } @Override public void onClick(View v) { Intent intent = new Intent(Main.this, MyService.class); switch (v.getId()) { case R.id.btnStart: this.startService(intent); break; case R.id.btnStop: this.stopService(intent); break; case R.id.btnBind: this.bindService(intent, conn, Context.BIND_AUTO_CREATE); break; case R.id.btnUnbind: this.unbindService(conn); break; } } // bindService() 所需的 ServiceConnection 對象 private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { } @Override public void onServiceDisconnected(ComponentName className) { } }; private String msg=""; private UpdateReceiver receiver; // 實現⼀個 BroadcastReceiver,用於接收指定的 Broadcast public class UpdateReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { msg = intent.getStringExtra("msg"); txtMsg.append(msg + "\n"); } } } MyService.java 代碼 package com.webabcd.service; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.util.Log; // 演示 Service 的生命週期。具體信息運行程序後在 LogCat 中查看 public class MyService extends Service { @Override public IBinder onBind(Intent intent) { Log.d("MyDebug", "onBind"); sendMsg("onBind"); // TODO Auto-generated method stub return null; } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); Log.d("MyDebug", "onCreate"); sendMsg("onCreate"); } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.d("MyDebug", "onDestroy"); sendMsg("onDestroy"); } @Override public void onRebind(Intent intent) { // TODO Auto-generated method stub super.onRebind(intent); Log.d("MyDebug", "onRebind"); sendMsg("onRebind"); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); Log.d("MyDebug", "onStart"); sendMsg("onStart"); } @Override public boolean onUnbind(Intent intent) { Log.d("MyDebug", "onUnbind"); sendMsg("onUnbind"); // TODO Auto-generated method stub return super.onUnbind(intent); } // 發送廣播信息 private void sendMsg(String msg){ // 指定廣播目標的 action (注:指定了此 action 的 receiver 會接收此廣播) Intent intent = new Intent("com.webabcd.service.msg"); // 須要傳遞的參數 intent.putExtra("msg", msg); // 發送廣播 this.sendBroadcast(intent); } } MyBootReceiver.java 代碼 package com.webabcd.service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class MyBootReceiver extends BroadcastReceiver { // 用於接收知足條件的 Broadcast(相應的 Broadcast 的註冊信息詳見 AndroidManifest.xml , 當系統啓動完畢後會調用這個廣播接收器) @Override public void onReceive(Context arg0, Intent arg1) { Log.d("MyDebug", "onReceive"); // 啓動服務 Intent service = new Intent(arg0, MyService.class); arg0.startService(service); } } AndroidManifest.xml 代碼 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.webabcd.service" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Main" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 若是有須要用到的 service ,則都要在這裏作相應的配置 --> <service android:name=".MyService"></service> <!-- 註冊⼀個 BroadcastReceiver 其 intent-filter 爲 android.intent.action.BOOT_COMPLETED(用於接收系統啓動完 畢的 Broadcast) --> <receiver android:name=".MyBootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> </application> <!-- 接受系統啓動完畢的 Broadcast 的權限 --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-sdk android:minSdkVersion="3" /> </manifest> OK [源碼下載]