Activity service 通信
引用:http://apps.hi.baidu.com/share/detail/32259955
前段時間工作太忙,所以android的學習落了下來。這兩天休息禮拜,重新研究。
之前學習了socket通訊,其中在service一端通過發送notificationbar顯示在終端的Activity上。
事實上這種方式對于客戶體驗上,是單一而不友好的。
下面,我們研究兩個問題,
1、Service如何通過Broadcaster更改activity的一個TextView。
(研究這個問題,是因為考慮到Service從服務器端獲得消息之后,將msg返回至activity)
2、Activity如何通過Binder調用Service的一個方法。
(研究這個問題,是因為考慮到,將所有與服務器端交互的動作,打包至Service,Activity只需呈現界面,調用Service的方法)
結構圖見如下:
效果圖如下:
?
點擊start,啟動Service,然后更改Activity的UI。
點擊Send Message to Server調用Service的方法,顯示NotificationBar
使用Binder要注意個的一個地方是:ServiceConnection,需要在ServiceConnection中,實例化一個Service,使之等于Activity調用的Service。注意看下面的紅色代碼。
Broadcaster的過濾詞,注意看下面的藍色代碼。
?
程序:
YaoTestBro.java:
package com.android.Yao;
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.*;
public class YaoTestBro extends Activity implements OnClickListener{
??? /** Called when the activity is first created. */
??? @Override
??? public void onCreate(Bundle savedInstanceState) {
??????? super.onCreate(savedInstanceState);
??????? setContentView(R.layout.main);
??????? txtmsg = (TextView)this.findViewById(R.id.txtmsg);
????????
??????? this.findViewById(R.id.start).setOnClickListener(this);
??????? this.findViewById(R.id.sendmsg).setOnClickListener(this);????
??????? receiver = new UpdateReceiver();
??????? IntentFilter filter= new IntentFilter();
??????? filter.addAction("com.android.Yao.msg");
??????? this.registerReceiver(receiver, filter);
??? }????
??? private UpdateReceiver receiver;
??? private TextView txtmsg;
??? private Button btnstart;
??? private Button btnstop;
??? private String msg = "";
????private MyService mservice;
????
??? public class UpdateReceiver extends BroadcastReceiver{
??@Override
??public void onReceive(Context context, Intent intent) {
???// TODO Auto-generated method stub
???msg = intent.getStringExtra("msg");
???txtmsg.append(msg);
??}??? ?
??? }
????
???private ServiceConnection conn = new ServiceConnection()
??? {
??@Override
??public void onServiceConnected(ComponentName name, IBinder service) {
???// TODO Auto-generated method stub
???mservice = ((MyService.LocalBinder)service).getService();
??}
??@Override
??public void onServiceDisconnected(ComponentName name) {
???// TODO Auto-generated method stub
???mservice = null;
??}
??? ?
??? };
?@Override
?public void onClick(View v) {
??// TODO Auto-generated method stub
??Intent intent=new Intent(YaoTestBro.this,MyService.class);
??switch(v.getId())
??{
???case R.id.start:
????this.bindService(intent, conn, BIND_AUTO_CREATE);
????break;
???case R.id.sendmsg:
????//可以在這里加一個判斷,如果啟動了Service則跳過這句
????this.bindService(intent, conn, BIND_AUTO_CREATE);?
????
????mservice.SendMsgtoServer("i am sending msg to server");
????break;
??}
??
?}????
}
?
MyService.java:
package com.android.Yao;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
public class MyService extends Service{
?/*activity通過Ibinder調用service中的方法,
? * service發送消息至sever,得到反饋之后,
? * sever返回消息至service,
? * service通過broadcast更改activity界面。
? */
?@Override
?public IBinder onBind(Intent arg0) {
??// TODO Auto-generated method stub
??String msg = "Service:Activity is sendding message to service,\n Service send msg to server!\n";
??SendMsgtoActivty(msg);
??return mBinder;
?}?
?
??? @Override
??? public void onCreate() {???????
?????SendMsgtoActivty("Service:Service is oncreating.\n");
??? }
?
?private void SendMsgtoActivty(String msg)
?{
??Intent intent=new Intent("com.android.Yao.msg");
??intent.putExtra("msg", msg);
??this.sendBroadcast(intent);
?}
?
?
??? private void shownotification(String tab)
??? {
???? NotificationManager barmanager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
???? Notification msg=new Notification(android.R.drawable.stat_notify_chat,"A Message Coming!",System.currentTimeMillis());????
???? PendingIntent contentIntent=PendingIntent.getActivity(this, 0, new Intent(this,YaoTestBro.class), PendingIntent.FLAG_ONE_SHOT);?
???? msg.setLatestEventInfo(this,"Message" , "Message:"+tab, contentIntent);
???? barmanager.notify(0, msg);
??? }
?
?public void SendMsgtoServer(String msg) {
??shownotification(msg);
?}
?
?public class LocalBinder extends Binder {
??MyService getService(){
???return MyService.this;
??}
?}
?
?private final IBinder mBinder = new LocalBinder();
}
MyBroadcaster.java:
package com.android.Yao;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyBroadcastreceiver extends BroadcastReceiver {
?@Override
?public void onReceive(Context context, Intent intent) {
??// TODO Auto-generated method stub
??Intent service = new Intent(context,MyService.class);
??context.startService(service);
??
?}
}
這里有兩個東西,一個是Broadcaster,一個是Binder。
Broadcaster有很廣泛的應用,多數的廣播是系統發起的,如地域變換、電量不足、來電來信等。
程序自己的廣播,可以通過filter.addAction來進行刪選。。。
Binder是一個類似于C#.net中的DataBinder的一個概念,
Activity-->打開Binder-->寫數據-->Service-->打開Binder-->寫數據-->Activity。
事實上,用Binder也可實現將值從Servcie傳送至Activity。。有興趣的同志可以自己學習學習。。。
貼一篇好文章:
http://blog.csdn.net/maxleng/archive/2010/04/15/5490770.aspx
總結
以上是生活随笔為你收集整理的Activity service 通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lync 2010的点击呼叫设置
- 下一篇: Eclipse 工作台用户指导视图和编辑