Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android應用開發教程之十:應用程序通信

Android應用開發教程之十:應用程序通信

編輯:關於android開發

  Android 開發中在程序之間通訊的接口做的還是非常豐富的 本例主要向大家介紹程序之間是如何進行溝通,有哪幾種溝通方式 如何來實現溝通。

  1.使用handler傳遞消息

  handler 大家可以把它想象成主線程(UI線程)的一個子線程,它可以給主線程(UI線程)發送數據從而更新主線程(UI線程)的UI與邏輯,handler 是一個子線程所以它的耗時操作不會阻塞主線程,大家都知道在android的開發中如果代碼中某個地方阻塞主線程超過5秒的話系統會提示ANR (系統提示強制關閉)所以在耗時操作上我們可以考慮開啟一個子線程避免ANR。  handler會向主線程發送消息 會以隊列的形式排列著配合等待主線程更新UI 邏輯 等等。

  下面這個例子诠釋了這一點 利用handler傳遞消息來更新主線程的UI顯示內容 點擊按鈕後每過一秒通過handler發送消息更新UI線程顯示的時間 直到顯示時間更新到10 然後結束這個線程。

Android應用開發教程之十:應用程序通信

Java代碼
  1. public class HandlerActivity extends Activity implements Runnable{  
  2.    
  3.     /**更新時間**/  
  4.     public final static int UPDATE_TIME =0;  
  5.     /**更新時間成功**/  
  6.     public final static int UPDATE_COMPLETED =1;  
  7.    
  8.     /**記錄顯示時間 超過10秒結束線程**/  
  9.     private int mShowNumber = 0;  
  10.    
  11.     /**開始計時按鈕**/  
  12.     private Button mButton = null;  
  13.    
  14.     /**計時顯示內容**/  
  15.     private TextView mTextView = null;  
  16.    
  17.     /**線程**/  
  18.     private Thread mThread = null;  
  19.    
  20.     /**線程關閉的標志**/  
  21.     private boolean mRunning = false;  
  22.    
  23.     Handler handler = new Handler() {  
  24.     @Override  
  25.     public void handleMessage(Message msg) {  
  26.    
  27.         Bundle bundle= msg.getData();  
  28.         //通過key的名稱拿到它的值  
  29.         String  number = bundle.getString("number");  
  30.         //msg.what為handler接收到的消息編號  
  31.         switch(msg.what) {  
  32.         case UPDATE_TIME:  
  33.         mTextView.setText("正在更新時間" + number);  
  34.         break;  
  35.         case UPDATE_COMPLETED:  
  36.         mTextView.setText("更新完畢");  
  37.         break;  
  38.         }  
  39.         super.handleMessage(msg);  
  40.     }  
  41.     };  
  42.    
  43.     @Override  
  44.     protected void onCreate(Bundle savedInstanceState) {  
  45.     setContentView(R.layout.handler);  
  46.    
  47.     /**拿到button 與  TextView 對象**/  
  48.     mButton = (Button)findViewById(R.id.button0);  
  49.     mTextView = (TextView)findViewById(R.id.textView0);  
  50.     mThread = new Thread(this);  
  51.    
  52.     mButton.setOnClickListener(new OnClickListener() {  
  53.         @Override  
  54.         public void onClick(View arg0) {  
  55.         /**點擊按鈕後開始線程開始計時**/  
  56.         mRunning = true;  
  57.         mThread.start();  
  58.         }  
  59.     });  
  60.    
  61.     mTextView.setText("點擊按鈕開始更新時間");  
  62.     super.onCreate(savedInstanceState);  
  63.     }  
  64.    
  65.     public void ShowDialog(String string) {  
  66.     AlertDialog.Builder builder = new AlertDialog.Builder(  
  67.         HandlerActivity.this);  
  68.     builder.setIcon(R.drawable.icon);  
  69.     builder.setTitle(string);  
  70.     builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {  
  71.         public void onClick(DialogInterface dialog, int whichButton) {  
  72.         finish();  
  73.         }  
  74.     });  
  75.     builder.show();  
  76.     }  
  77.    
  78.     @Override  
  79.     public void run() {  
  80.    
  81.     while (mRunning) {  
  82.         try {  
  83.         mShowNumber++;  
  84.         /** 把須要的數據放入bandle中 **/  
  85.         Bundle bandle = new Bundle();  
  86.         bandle.putString("number", String.valueOf(mShowNumber));  
  87.    
  88.         /** 設置這條信息的編號為更新時間 **/  
  89.         /** 將bandle寫入message中 **/  
  90.         /** 最後將這個message發送出去 **/  
  91.         /** mShowNumber小於10更新時間 否則更新完畢 **/  
  92.         Message msg = new Message();  
  93.         if(mShowNumber <=10) {  
  94.             msg.what = UPDATE_TIME;  
  95.         }else {  
  96.             mRunning = false;  
  97.             msg.what = UPDATE_COMPLETED;  
  98.         }  
  99.         msg.setData(bandle);  
  100.         handler.sendMessage(msg);  
  101.         Thread.sleep(1000);  
  102.         } catch (InterruptedException e) {  
  103.         e.printStackTrace();  
  104.         }  
  105.     }  
  106.     }  
  107. }  

  2.Notifation通知欄信息

  Notifation通知欄會在屏幕上方向用戶提示信息 但是不會打斷用戶正在閱讀的內容,除非用戶手動將 Notifation通知欄拉下。 Notifation的好處就是在於不會影響用戶的操作,比如用戶正在閱讀非常重要的信息這時候幫他直接打開一個activity會非常不合適 因為直接影響到了他當時的操作行為 所以Notifation就出來了。建議大家在開發中遇到可能打斷用戶使用的情況下都去使用Notifation通知欄。

       屏幕上方為彈出的Notifation通知欄

Android應用開發教程之十:應用程序通信

  將Notifation通知欄拉下後會出現相應的信息

Android應用開發教程之十:應用程序通信

Java代碼
  1. public class NotificationActivity extends Activity {  
  2.     NotificationManager mManager = null;  
  3.     Notification notification =null;  
  4.     @Override  
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.     setContentView(R.layout.notification);  
  7.    
  8.     // 得到通知消息的管理器對象,負責管理 Notification 的發送與清除消息等  
  9.     mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);  
  10.     // 創建Notification對象 參數分別代表 通知欄 中顯示的圖標 顯示的標題 顯示的時間  
  11.     notification = new Notification(R.drawable.jay,  
  12.         "Android專業開發群", System.currentTimeMillis());  
  13.    
  14.     // 設置在通知欄中點擊後Notification自動消失  
  15.     notification.flags = Notification.FLAG_AUTO_CANCEL;  
  16.    
  17.     //設置點擊後轉跳的新activity  
  18.     Intent intent = new Intent(this, MyShowActivity.class);  
  19.     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP¦ Intent.FLAG_ACTIVITY_NEW_TASK);  
  20.    
  21.     //通過bundle可以帶一些數據過去 這裡將字符串傳遞了過去  
  22.     Bundle bundle = new Bundle();  
  23.     bundle.putString("name", "從Notification轉跳過來的");  
  24.     intent.putExtras(bundle);  
  25.    
  26.     //設置通知欄中顯示的內容  
  27.     PendingIntent contentIntent = PendingIntent.getActivity(this,  
  28.         R.string.app_name, intent, PendingIntent.FLAG_UPDATE_CURRENT);  
  29.     notification.setLatestEventInfo(this, "Android專業開發群",  
  30.         "QQ群號 164257885", contentIntent);  
  31.    
  32.     Button button0 = (Button)findViewById(R.id.button0);  
  33.     button0.setOnClickListener(new OnClickListener() {  
  34.    
  35.         @Override  
  36.         public void onClick(View arg0) {  
  37.         //打開這個Notification通知  
  38.         mManager.notify(0, notification);  
  39.         }  
  40.     });  
  41.    
  42.     Button button1 = (Button)findViewById(R.id.button1);  
  43.     button1.setOnClickListener(new OnClickListener() {  
  44.    
  45.         @Override  
  46.         public void onClick(View arg0) {  
  47.         //關閉這個Notification通知  
  48.         mManager.cancelAll();  
  49.         }  
  50.     });  
  51.    
  52.     super.onCreate(savedInstanceState);  
  53.     }  
  54.    
  55. }  

  3.廣播的發送與接收

  Android開發中如果須要對兩個完全沒關系的程序之間進行通信 就可以使用發送廣播與接收廣播的機制來實現 ,例如程序A發送了一個廣播 程序B接受到 做一些事情 這樣就達到了相互的通訊。

Android應用開發教程之十:應用程序通信

  調用sendBroadcast() 傳入intent  後 來發送廣播

Java代碼
  1. public class BroadcastActivity extends Activity {  
  2.    
  3.     Button mButton0 = null;  
  4.     Button mButton1 = null;  
  5.    
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.     setContentView(R.layout.broadcast);  
  9.    
  10.     mButton0 = (Button)findViewById(R.id.button0);  
  11.     mButton0.setOnClickListener(new OnClickListener() {  
  12.    
  13.         @Override  
  14.         public void onClick(View arg0) {  
  15.                 Intent intent = new Intent(MyService.SEND_OK_MESSAGE);  
  16.                 intent.putExtra("name", "您發送了OK這條廣播哦");  
  17.                 sendBroadcast(intent);  
  18.         }  
  19.     });  
  20.    
  21.     mButton1 = (Button)findViewById(R.id.button1);  
  22.     mButton1.setOnClickListener(new OnClickListener() {  
  23.    
  24.         @Override  
  25.         public void onClick(View arg0) {  
  26.                 Intent intent = new Intent(MyService.SEND_CANCLE_MESSAGE);  
  27.                 intent.putExtra("name", "您發送了Cancle這條廣播哦");  
  28.                 sendBroadcast(intent);  
  29.         }  
  30.     });  
  31.    
  32.     //啟動Service  
  33.     Intent i = new Intent(this, MyService.class);  
  34.     startService(i);  
  35.     super.onCreate(savedInstanceState);  
  36.     }  
  37. }  

  接收廣播的話 我們開啟一個service 在service中通過BroadcastReceiver 來接收廣播 前提是須要接收的廣播須要在onStart()中注冊一下 在AndroidManifest.xml中可以過濾只接收須要接收的廣播。

XML/HTML代碼
  1. <service android:name=".MyService">  
  2.     <intent-filter>  
  3.         <action android:name="cn.m15.xys.MyService"></action>  
  4.     </intent-filter>  
  5.     <intent-filter>  
  6.         <action android:name="send.ok.message" />  
  7.         <action android:name="send.cancle.message" />  
  8.     </intent-filter>  
  9. </service>  

  在onStart()中注冊了程序中所需要的兩個廣播

Java代碼
  1. public class MyService extends Service {  
  2.    
  3.     public final static String SEND_OK_MESSAGE = "send.ok.message";  
  4.     public final static String SEND_CANCLE_MESSAGE = "send.cancle.message";  
  5.    
  6.     private BroadcastReceiver myBroadCast = new BroadcastReceiver() {  
  7.    
  8.     @Override  
  9.     public void onReceive(Context context, Intent intent) {  
  10.         String action = intent.getAction();  
  11.         if (action.equals(SEND_OK_MESSAGE)) {  
  12.         Toast.makeText(context, "接收到了一條廣播為" + SEND_OK_MESSAGE, Toast.LENGTH_LONG).show();  
  13.         }else if(action.equals(SEND_CANCLE_MESSAGE)) {  
  14.         Toast.makeText(context, "接收到了一條廣播為" + SEND_CANCLE_MESSAGE, Toast.LENGTH_LONG).show();  
  15.         }  
  16.     }  
  17.    
  18.     };  
  19.    
  20.     @Override  
  21.     public void onCreate() {  
  22.     super.onCreate();  
  23.     }  
  24.    
  25.     @Override  
  26.     public void onStart(Intent intent, int startId) {  
  27.     //注冊這兩個廣播  
  28.     IntentFilter myFilter = new IntentFilter();  
  29.     myFilter.addAction(SEND_OK_MESSAGE);  
  30.     myFilter.addAction(SEND_CANCLE_MESSAGE);  
  31.     this.registerReceiver(myBroadCast, myFilter);  
  32.         super.onStart(intent, startId);  
  33.     }  
  34.     @Override  
  35.     public IBinder onBind(Intent arg0) {  
  36.     return null;  
  37.     }  
  38.    
  39. }  

  這裡注意一下 service如果沒有起來 我們是接收不到廣播的 所以一定要保證接收的時候service是開啟的,上例中的service是在打開activity時開啟的 但是如果用戶把手機關掉然後在開機 , 這樣的話service就不是打開狀態 這樣就非常危險了因為這時scrvice就接收不到任何消息了除非用戶再次進activity 才會幫他打開scrvice 所以我們可以在用戶開機後就直接將scrvice打開,具體的實現方式如下

  在AndroidManifest.xml中注冊一個開機廣播  這個廣播系統只會在開機發出而且只會發出一次 所以我們接收這個廣播就可以知道手機是否為開機狀態

XML/HTML代碼
  1. <receiver android:name=".MyBootReceiver" >  
  2.     <intent-filter>  
  3.        <action android:name="android.intent.action.BOOT_COMPLETED" />  
  4.    </intent-filter>  
  5. </receiver>  

  注意加入權限

XML/HTML代碼
  1. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />  

  在BroadcastRecevier中接收開機廣播  然後打開service 就可以實現開機啟動service。

Java代碼
  1. public class MyBootReceiver extends BroadcastReceiver {  
  2.    /**開機廣播**/  
  3.     static final String BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";  
  4.    
  5.     @Override  
  6.     public void onReceive(Context context, Intent intent) {  
  7.     /**如果為開機廣播則開啟service**/  
  8.     if (intent.getAction().equals(BOOT_COMPLETED)) {  
  9.         Intent i = new Intent(context, MyService.class);  
  10.         context.startService(i);  
  11.     }  
  12.    
  13.     }  
  14. }  

  3.Activity與Activity之間的轉跳

  在軟件應用的開發中肯定會有多個Activity     這樣它們之間就會存在相互轉跳的關系      轉跳的實現方式還是使用Intent  然後startActivity  ,當然轉跳的話是可以帶數據過去的。比如從A跳到B 可以把A中的一些數據通過Intent傳遞給B 。

Android應用開發教程之十:應用程序通信

  讀下面這段代碼 大家會發現intent與bandle 傳遞數值的方式基本一樣為什麼還要分成兩個呢? 確實他們兩個傳遞的數值的方式非常類似, 他們兩個的區別就是Intent屬於把零散的數據傳遞過去 而bundle則是把零散的數據先放入bundle 然後在傳遞過去。我舉一個例子 比如我們現在有3個activity  A.B.C  須要把A的數據穿給B然後在穿給C ,如果使用intent一個一個傳遞 須要在A類中一個一個傳遞給B 然後B類中獲取到所有數值  然後在一個一個傳遞給C  這樣很麻煩 但是 如果是bundle的話 B類中直接將bundler傳遞給C 不用一個一個獲得具體的值  然後在C類中直接取得解析數值。

  傳遞

Java代碼
  1. /**Activity之間傳遞值**/  
  2.         Button botton3 = (Button)findViewById(R.id.button3);  
  3.         botton3.setOnClickListener(new OnClickListener() {  
  4.    
  5.         @Override  
  6.         public void onClick(View arg0) {  
  7.          Intent intent = new Intent(mContext,ShowActivity.class);  
  8.          //使用intent.putExtra()直接傳遞  
  9.          intent.putExtra("name", "雨松MOMO");  
  10.          intent.putExtra("age", 25);  
  11.          intent.putExtra("boy", true);  
  12.    
  13.          //把數值放進bundle 然後在把整個bundle通過intent.putExtra()傳遞  
  14.          Bundle bundle = new Bundle();  
  15.          bundle.putString("b_name", "小可愛");  
  16.          bundle.putInt("b_age", 23);  
  17.          bundle.putBoolean("b_boy", false);  
  18.          //在這裡把整個bundle 放進intent中  
  19.          intent.putExtras(bundle);  
  20.          //開啟一個新的 activity 將intent傳遞過去  
  21.          startActivity(intent);  
  22.         }  
  23.     });  

  接收

Java代碼
  1. public class ShowActivity extends Activity {  
  2.    
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.     setContentView(R.layout.my);  
  6.    
  7.     Intent intent = getIntent();  
  8.    
  9.     String name = intent.getStringExtra("name");  
  10.     //第二個參數為默認值 意思就是如果在intent中拿不到的話  
  11.     //就用默認值  
  12.     int age  = intent.getIntExtra("age", 0);  
  13.     boolean isboy = intent.getBooleanExtra("boy", false);  
  14.     TextView textView0 = (TextView)findViewById(R.id.text0);  
  15.    
  16.     textView0.setText("姓名  " + name + "年齡 " + age + "男孩?  " + isboy);  
  17.    
  18.     Bundle bundle = intent.getExtras();  
  19.     name = bundle.getString("b_name");  
  20.     //第二個參數為默認值 意思就是如果在bundle中拿不到的話  
  21.     //就用默認值  
  22.     age = bundle.getInt("b_age",0);  
  23.     isboy = bundle.getBoolean("b_boy", false);  
  24.    
  25.     TextView textView1 = (TextView)findViewById(R.id.text1);  
  26.    
  27.     textView1.setText("姓名  " + name + "年齡 " + age + "男孩?  " + isboy);  
  28.    
  29.     super.onCreate(savedInstanceState);  
  30.     }  
  31.    
  32. }  

  源碼下載地址:http://vdisk.weibo.com/s/aa3fI

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved