Service_2014.07.22

来源:互联网 发布:win10无损分区软件 编辑:程序博客网 时间:2024/06/02 04:24

Service的两种启动方式:1.StartService。2.BindService。


BindService使用步骤:写一个Service的子类,例如MyService。会要求重写onBind(Intent intent)方法,其返回值类型IBinder。

在MyService中,写一个Binder的子类,例如MyBinder。在MyBinder中可按需求,自定义方法。

实例化MyBinder,设置为onBinder()的返回值。

在MainActivity中,实例化ServiceConnection回调接口。会要求重写onServiceDisconnected(ComponentName name)和onServiceConnected(ComponentName name, 

IBinder service)两个方法。在onServiceConnected()方法中,将传入的参数service向下转型为MyBinder。

用MyBinder的实例,调用自身的成员方法即可。


需求:挂起一个Serivice在后台,循环定时访问服务器,保持在线状态。

实现:MainActivity代码。

package com.jzxlit.im;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.content.SharedPreferences;import android.os.Bundle;import android.os.IBinder;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentTabHost;import android.widget.RadioGroup;import android.widget.RadioGroup.OnCheckedChangeListener;import android.widget.TabHost.TabSpec;import com.jzxlit.fragment.ChatFragmentMain;import com.jzxlit.fragment.FriendFragmentMain;import com.jzxlit.fragment.SearchFragmentMain;import com.jzxlit.hessian.HessianImpl;import com.jzxlit.im.R;import com.jzxlit.service.BaseService;import com.jzxlit.service.BaseService.MyBinder;public class MainActivity extends FragmentActivity {// 定义FragmentTabHost对象private FragmentTabHost mTabHost;private RadioGroup mTabRg;HessianImpl hessianImpl;String clientKey;private BaseService.MyBinder myBinder;private ServiceConnection serviceConnection = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {myBinder = (BaseService.MyBinder) service;Intent intent = getIntent();Bundle bundle = intent.getExtras();String account = bundle.getString("account");String password = bundle.getString("password");myBinder.keepAlive(account, password);}};private final Class[] fragments = { ChatFragmentMain.class,FriendFragmentMain.class, SearchFragmentMain.class };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initData();initView();initService();}private void initService() {Intent intent = new Intent(MainActivity.this, BaseService.class);bindService(intent, serviceConnection, BIND_AUTO_CREATE);startService(intent);}private void initData() {// hessianImpl.getRoot(account, password);// 类静态属性的使用。// 从hessian获取的数据存入list-map集合。// 插入数据库的过程。// 从数据库取出数据,cursor转list-map并加载到iPhoneTreeView。// 最近聊天的数据表字段设计,存取。// 登录帐号account和password的保存。SharedPreferences的使用。// 全局变量的使用。// SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);// sharedPreferences.edit().putString(key, value);}private void initView() {mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);// 得到fragment的个数int count = fragments.length;for (int i = 0; i < count; i++) {// 为每一个Tab按钮设置图标、文字和内容TabSpec tabSpec = mTabHost.newTabSpec(i + "").setIndicator(i + "");// 将Tab按钮添加进Tab选项卡中mTabHost.addTab(tabSpec, fragments[i], null);}mTabRg = (RadioGroup) findViewById(R.id.tab_rg_menu);mTabRg.setOnCheckedChangeListener(new OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {switch (checkedId) {case R.id.tab_rb_1:mTabHost.setCurrentTab(0);break;case R.id.tab_rb_2:mTabHost.setCurrentTab(1);break;case R.id.tab_rb_3:mTabHost.setCurrentTab(2);break;default:break;}}});mTabHost.setCurrentTab(0);}}
BaseService代码。

package com.jzxlit.service;import com.caucho.hessian.client.HessianProxyFactory;import com.jzxlit.util.StringUtils;import cn.com.jzxl.polabear.im.napi.NMessage;import cn.com.jzxl.polabear.im.napi.spi.SessionService;import android.app.Service;import android.content.Intent;import android.hardware.Camera.Face;import android.os.Binder;import android.os.IBinder;public class BaseService extends Service {private MyBinder myBinder = new MyBinder();private HessianProxyFactory factory = new HessianProxyFactory();@Overridepublic IBinder onBind(Intent intent) {return myBinder;}public class MyBinder extends Binder {public void keepAlive(final String account, final String password) {System.out.println("keepAlive() executed");new Thread() {public void run() {try {System.out.println("开启线程");SessionService ss = (SessionService) factory.create(SessionService.class, StringUtils.session);String clientKey = ss.login(account, password, "zh_CN");ss.setPresence(clientKey, "ONLINE");while (true) {Thread.sleep(60000);System.out.println("请求服务器");NMessage[] nMessages = ss.getMessage(clientKey);}} catch (Exception e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}}.start();}}}

问题:测试后,发现获取的clientKey的三行代码,要放在while循环内。clientKey会定时失效,必须重新获取。


0 0
原创粉丝点击