android之Service

Service的启动方式以及停止的方式两种:

第一:绑定和解除绑定的方式,如果要实现activity和Service之间进行通讯的话,要在Service中写回调函数,其中定义内部类集成binder,在Activity中绑定


bindService(intent, sc, Context.BIND_AUTO_CREATE);
sc = new ServiceConnection() {
<span style="white-space:pre">			</span>@Override
<span style="white-space:pre">			</span>public void onServiceDisconnected(ComponentName name) {
<span style="white-space:pre">				</span>// 解除绑定的时候
<span style="white-space:pre">			</span>}


<span style="white-space:pre">			</span>@Override
<span style="white-space:pre">			</span>public void onServiceConnected(ComponentName name, IBinder service) {
<span style="white-space:pre">				</span>// 建立绑定
<span style="white-space:pre">				</span>mbinder = (Myservice.MyBinder) service;
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>};
第二种是start和stop的方式,这种方式:

如果一个Service被某个Activity 调用 Context.startService 方法启动,那么不管是否有Activity使用bindService绑定或unbindService解除绑定到该Service,该Service都在后台运行。如果一个Service被startService 方法多次启动,那么onCreate方法只会调用一次,onStart将会被调用多次(对应调用startService的次数),并且系统只会创建Service的一个实例(因此你应该知道只需要一次stopService调用)。该Service将会一直在后台运行,而不管对应程序的Activity是否在运行,直到被调用stopService,或自身的stopSelf方法。当然如果系统资源不足,android系统也可能结束服务。

bindService()和start都能使Service调用Oncreat()方法,而且onCreat()方法只调用一次。

《1》多次使用StartService的时候回多次调用onStart()方法。

《2》多次调用bindService什么都不会调用。


package com.example.burdemo;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class ServiceDemoActivity extends Activity implements OnClickListener {
	private ServiceConnection sc;

	private Button bt1, bt2, bt3, bt4, bt5, bt6;
	boolean isConn;
	private EditText editText1;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_service_demo);

		bt1 = (Button) this.findViewById(R.id.button1);
		bt2 = (Button) this.findViewById(R.id.button2);
		bt3 = (Button) this.findViewById(R.id.button3);
		bt4 = (Button) this.findViewById(R.id.button4);
		bt5 = (Button) this.findViewById(R.id.button5);
		bt6 = (Button) this.findViewById(R.id.button6);

		bt1.setOnClickListener(this);
		bt2.setOnClickListener(this);
		bt3.setOnClickListener(this);
		bt4.setOnClickListener(this);
		bt5.setOnClickListener(this);
		bt6.setOnClickListener(this);

		editText1 = (EditText) findViewById(R.id.editText1);
		sc = new ServiceConnection() {
			@Override
			public void onServiceDisconnected(ComponentName name) {
				// 解除绑定的时候
			}

			@Override
			public void onServiceConnected(ComponentName name, IBinder service) {
				// 建立绑定
				mbinder = (Myservice.MyBinder) service;
			}
		};
	}

	Myservice.MyBinder mbinder;
	// 绑定点击事件

	@Override
	public void onClick(View v) {
		int id = v.getId();
		if (id == R.id.button1) {
			Log.d("drummor", "开始吧");
			Intent intent = new Intent(this, Myservice.class);
			bindService(intent, sc, Context.BIND_AUTO_CREATE);

			isConn = true;
		} else if (id == R.id.button2) {
			if (isConn) {
				Log.d("drummor", "解除绑定!");
				mbinder.stopThread();
				unbindService(sc);
				isConn = false;
			}
		} else if (id == R.id.button3) {
			Intent intent = new Intent(this, OtherActivity.class);
			Log.d("drummor", "");
			startActivity(intent);
		} else if (id == R.id.button4) {
			handler.post(runable);
		} else if (id == R.id.button5) {

			stopService(new Intent(this, Myservice.class));
		} else if (id == R.id.button6) {

			startService(new Intent(this, Myservice.class));
		}

	}

	Runnable runable = new Runnable() {

		@Override
		public void run() {
			Message msg = new Message();
			msg.what = mbinder.getNum();
			handler.sendMessage(msg);
			handler.postDelayed(runable, 1000);
		}
	};

	Handler handler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			editText1.setText("djdki" + msg.what);
		}

	};
}

service中的操作:

package com.example.burdemo;

import android.app.Service;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class Myservice extends Service {

	public MyBinder myBinder;
	public MyThread t;
	public int i = 0;

	class MyBinder extends Binder {
		public Myservice getService() {

			return Myservice.this;
		}

		public int getNum() {
			return i;
		}

		public void stopThread() {
			t.isRun = false;
		}
	}

	@Override
	public void onCreate() {

		super.onCreate();
		Log.d("drummor", "------------->创建service");

		myBinder = new MyBinder();
		run();
	}

	private void run() {
		t = new MyThread();
		t.start();
	}

	class MyThread extends Thread {
		boolean isRun = true;

		@Override
		public void run() {
			Log.d("drummor", "运行了么" + isRun);
			while (isRun) {
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();

				}
				Log.d("drummor", "------------->" + (i++));
			}

		}

	}

	@Override
	public IBinder onBind(Intent intent) {
		Log.d("drummor", "------------->建立绑定");
		return myBinder;
	}

	@Override
	public void onStart(Intent intent, int startId) {
		// TODO Auto-generated method stub
		Log.d("drummor", "------------->onStart");
		super.onStart(intent, startId);
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		Log.d("drummor", "------------->start");
		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	public void unbindService(ServiceConnection conn) {
		// TODO Auto-generated method stub
		Log.d("drummor", "------------->解除绑定");
		super.unbindService(conn);

	}

	@Override
	public void onDestroy() {
		t.isRun = false;
		super.onDestroy();
		Log.d("drummor", "------------->销毁");
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值