androi之Service+Broadcast+Timer+ui【通过绑定服务、自定义回调接口判断

最近项目要定时从服务器获取某些信息,通过研究来总结一下下【我以定时判断网络状态为例来阐述】

原理:

我们定义一个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-08-29 08:08:09

androi之Service+Broadcast+Timer+ui【通过绑定服务、自定义回调接口判断的相关文章

Android Service组件在新进程绑定(bindService)过程

1.首先看两个例子 (1)进程内 Client端 public class CounterService extends Service implements ICounterService { ...... public class CounterBinder extends Binder { public CounterService getService() { return CounterService.this; } } ...... } Server端 public class Ma

Android Service组件在进程内绑定(bindService)过程

本文参考Android应用程序绑定服务(bindService)的过程源代码分析http://blog.csdn.net/luoshengyang/article/details/6745181和<Android系统源代码情景分析>,作者罗升阳 一.Android Service组件在进程内绑定(bindService)过程 0.总图流程图如下: 1.Counter和CounterService所在应用程序主线程向ActivityManagerService进程发送BIND_SERVICE_T

adnroid四大组件之Service(5) 绑定服务,数据通信-IBinder

绑定服务: 第一步:创建一个服务类,实现onBind() 方法, 返回一个IBinder对象, 这个对象定义了与服务通信的接口,客户端接收到这个IBinder,与服务进行 通信.  IBinder的实现类通过一个 方法用来获取服务,和onTransact方法 与客户端进行通信. 第二步:在清单文件注册服务<service>  <service android:name="com.example.bindservicedemo.BindService"></

旺仔练习:service的普通方式和绑定方式的启动和停止

package com.example.administrator.test.Fragment.Service; import android.app.IntentService; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.n

Android(java)学习笔记228:服务(service)之绑定服务调用服务里面的方法

1.绑定服务调用服务里面的方法,图解: 步骤: (1)在Activity代码里面绑定 bindService(),以bind的方式开启服务 :                     bindService(intent, new MyConn(), BIND_AUTO_CREATE): 参数intent:意图对象,服务对应的意图对象  new  Intent(this,Service.class) 参数ServiceConnection (接口,自定义其接口实现内部类MyConn() ):通讯

绑定服务-----------binderService TimerTask的使用

绑定服务 服务中通过定义Binder对象的子类让这个子类成为桥梁   在onBind()中返回子类对象 这样就可以在activity中调用这个子类的方法 在Activity中通过ServiceConnection获取这个对象并向下转型为该子类对象 y与Activity绑定的服务当Activity结束的时候服务也会跟着结束 timer.cancel()会结束timerTask中的所有任务 NotifyManager.cancel(2)  2是对应的通知的id 会结束对应的通知 1 import a

Xamarin.Android广播接收器与绑定服务

一.前言 学习了前面的活动与服务后,你会发现服务对于活动而言似乎就是透明的,相反活动对于服务也是透明的,所以我们还需要一中机制能够将服务和活动之间架起一座桥梁,通过本节的学习,你将会学到广播与绑定服务,这两种方式恰恰是解决上面问题的关键. 二.简单的广播接收器 实现一个最简单的广播接收器需要继承BroadcastReceiver类,并且还要实现OnReceive方法,我们可以在项目中新建一个MainReceiver类,然后写入如下代码: 1 public class MainReceiver :

Android应用程序绑定服务(bindService)的过程源代码分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6745181 Android应用程序组件Service与Activity一样,既可以在新的进程中启动,也可以在应用程序进程内部 启动:前面我们已经分析了在新的进程中启动Service的过程,本文将要介绍在应用程序内部绑定Service的过程,这是一种在应用程序进程内部启动 Service的方法. 在前面一篇文章Android进程间通信(IPC)机

绑定服务学习

绑定服务主要是其他组件绑定服务(比如活动),然后发送请求,接收返回.这个服务主要是作为其他组件的佣人,不会再后台无限 地运行.个人认为关键要学习的是如何绑定以及服务和组件之间的通信. 如何绑定到服务 一个绑定的服务是Service类的实现,允许其他组件绑定和他通信.要为服务提供绑定,必须实现onBind回调方法.这个方法返回IBinder, 定义了客户端可以和服务通信的程序接口. 客户端可以调用bindService绑定到service上,要这么做必须提供ServiceConnection的实现