系出名門Android(4) - 活動(Activity), 服務(Service), 廣播(...


系出名門Android(4) - 活動(Activity), 服務(Service), 廣播(Broadcast), 廣播接收

器(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 [源碼下載]
相關文章
相關標籤/搜索