最近项目要定时从服务器获取某些信息,通过研究来总结一下下【我以定时判断网络状态为例来阐述】
原理:
我们定义一个Service,在该Service中设置一个定时器Timer,通过TimerTask的策略来检查当前应用的网络连接状态,关键是在该Service需要自定义一个回调接口用于向我们的Activity来回调发送网络状态,然后通过Bind来绑定当前的Service,在绑定成功之后得到回调信息
代码:
Service类
package com.example.androidtimerdemo; import java.util.Timer; import java.util.TimerTask; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.NetworkInfo.State; import android.os.Binder; import android.os.IBinder; import android.util.Log; import android.widget.Toast; public class NetService extends Service { @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return netBind; } //上下文 Context context; //网络连接状态 boolean isConntect = true; //定时器 Timer timer = new Timer(); @Override public void onCreate() { // 注册广播 检查网络状态 IntentFilter filter = new IntentFilter(); filter.addAction( ConnectivityManager.CONNECTIVITY_ACTION ); registerReceiver( receiver, filter ); Log.i( "tag", "service**"+Thread.currentThread().getId() ); super.onCreate(); } //网络检查广播接受者 private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); // 启动定时任务 if (action.equals( ConnectivityManager.CONNECTIVITY_ACTION )) { //立即启动,每隔5秒执行一次Task Log.i( "tag", "receiver**"+Thread.currentThread().getId() ); timer.schedule( new NetTask( context ), 0, 5*1000 ); } } }; //具体的TimerTask实现类 class NetTask extends TimerTask { public NetTask(Context context1) { context = context1; } @Override public void run() { try { Thread.sleep( 20*1000 ); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (isConnectNet()) { isConntect = true; } else { isConntect = false; } Log.i( "tag", "run**"+Thread.currentThread().getId() ); if (onGetConnectState != null) { onGetConnectState.GetState( isConntect ); // 通知网络状态改变 } } } // 网络状态改变之后,通过此接口的实例通知当前网络的状态,此接口在Activity中注入实例对象 public interface GetConnectState { public void GetState(boolean isConnected); } private GetConnectState onGetConnectState; public void setOnGetConnectState(GetConnectState onGetConnectState) { this.onGetConnectState = onGetConnectState; } /** * 判断是否连通网络 * @return */ private boolean isConnectNet() { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE ); NetworkInfo Mobile = connectivityManager.getNetworkInfo( ConnectivityManager.TYPE_MOBILE ); NetworkInfo Wifi = connectivityManager.getNetworkInfo( ConnectivityManager.TYPE_WIFI ); if (Mobile.getState().equals( State.DISCONNECTED ) && Wifi.getState().equals( State.DISCONNECTED )) { return false; } return true; } //定义一个Bind类 private NetBind netBind = new NetBind(); class NetBind extends Binder { public NetService getNetService() { return NetService.this; } } //销毁广播、停止定时轮询 @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); timer.cancel(); unregisterReceiver( receiver ); } }
Activity:
package com.example.androidtimerdemo; import java.util.Timer; import java.util.TimerTask; import com.example.androidtimerdemo.MybindService.MyBind; import com.example.androidtimerdemo.NetService.GetConnectState; import com.example.androidtimerdemo.NetService.NetBind; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener { TextView textView; TextView textView2; Button button1, button2; Activity activity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate( savedInstanceState ); setContentView( R.layout.activity_main ); activity = this; initView(); } private void initView() { textView = (TextView) findViewById( R.id.textView1 ); textView2 = (TextView) findViewById( R.id.textView2 ); button1 = (Button) findViewById( R.id.button1 ); button2 = (Button) findViewById( R.id.button2 ); button1.setOnClickListener( this ); button2.setOnClickListener( this ); } boolean is; @Override public void onClick(View v) { switch (v.getId()) { case R.id.button1: // 绑定服务 Log.i( "tag", "click**" + Thread.currentThread().getId() ); Intent intent = new Intent( activity, NetService.class ); boolean isTrue = bindService( intent, conn, Context.BIND_AUTO_CREATE ); is = isTrue; break; case R.id.button2: unBind(); default: break; } } private void unBind() { if (conn != null) { unbindService( conn ); } } private boolean conncetState = true; private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } @Override public void onServiceConnected(ComponentName name, IBinder service) { NetBind bind = (NetBind) service; NetService netService = bind.getNetService(); //此处回调 netService.setOnGetConnectState( new GetConnectState() { @Override public void GetState(boolean isConnected) { // TODO Auto-generated method stub if (conncetState != isConnected) { conncetState = isConnected; } Message msg = handler.obtainMessage(); if (conncetState) { msg.what = 1; } else { msg.what = 2; } handler.sendMessage( msg ); } } ); } }; Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 1: Toast.makeText( activity, "connect", 2000 ).show(); break; case 2: Toast.makeText( activity, "not", 2000 ).show(); default: break; } }; }; }
时间: 2024-10-29 03:43:02