Android之Service

一、服务的简单介绍

快速入门service,因为就对概念不做太多介绍

一句话说明service用途,比如我们点击一首歌,activity展示歌词,播放时间等等,而后台则通过service来控制歌曲播放的各种事务(停止,下一首等等)


直接上demo


二、activity调用服务的两种方式



2.1 startService方式


布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="service demo"
    />
    <LinearLayout 
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
   <Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="开启服务"
    android:id="@+id/startBt"
   >
   
   </Button>
    <Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="关闭服务"
    android:id="@+id/stopBt"
   >
   
   </Button>
    <Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="组件退出"
    android:id="@+id/exitBt"
   >
   
   </Button>
   </LinearLayout>
</LinearLayout>

activity
public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		startBt = (Button) findViewById(R.id.startBt);
		stopBt = (Button) findViewById(R.id.stopBt);
		exitBt = (Button) findViewById(R.id.exitBt);
		final Intent intent = new Intent();
		intent.setAction("com.lwx.service.MYSERVICE");
		startBt.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				// 启动Service
				startService(intent);
			}
		});
		stopBt.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				// 停止Service
				stopService(intent);
			}
		});
		exitBt.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				// 关闭组件 但是服务没有关闭
				// 通过bindService可以实现两者动作一致
				ServiceActivity.this.finish();
			}
		});

	}

service代码

/**
 * @author draem0507
 * @TODO <p>
 *       自定义服务 继承service 重写onBind方法
 *       </p>
 *       <p>
 *       需要在Mainfest.xml中配置
 *       </p>
 * @version 1.0
 * @date 2012 下午04:49:01
 */
public class MyService extends Service {

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		Log.e("服务--", "onCreate");
		super.onCreate();
	}

	@Override
	public void onDestroy() {
		Log.e("服务--", "onDestroy");
		super.onDestroy();
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		Log.e("服务--", "onStart");

		return super.onStartCommand(intent, flags, startId);
	}

}

AndroidManifest.xml配置
  <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".ServiceActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
	<!-- 配置service 组件 -->
	<service android:name=".MyService">
		<intent-filter >
			<action android:name="com.lwx.service.MYSERVICE" />
		</intent-filter>
	</service>
	
    </application>

2.2 onbind方式


布局省略,大同小异
service代码
private MyBinder binder = new MyBinder();
	private boolean quit;
	private int count;

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return binder;
	}

	public class MyBinder extends Binder {

		public int getCount() {

			return count;
		}
	}

	// 创建服务时候调用
	@Override
	public void onCreate() {

		Log.e("", "创建连接--create");
		new Thread() {

			@Override
			public void run() {
				while (!quit) {
					try {
						sleep(100);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					count++;
					Log.e("count==", "" + count);
					
				}

			}

		}.start();
		super.onCreate();
	}

	// 销毁服务时候调用
	@Override
	public void onDestroy() {
		quit = true;
		count = 0;
		Log.e("", "销毁连接--destroy");
		super.onDestroy();
	}

	// 失去连接服务时候调用
	@Override
	public boolean onUnbind(Intent intent) {
		// TODO Auto-generated method stub
		Log.e("", "失去连接--unbind");
		return super.onUnbind(intent);
	}

activity代码
private MyService.MyBinder binder;
	private final Intent intent = new Intent();
	// 通过服务连接来打通service跟activity之间数据传输
	private ServiceConnection connection = new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			System.out.println("onServiceDisconnected");
			//binder = null;
		}

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			System.out.println("onServiceConnected");
			binder = (MyBinder) service;
		}
	};

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		// http://tech.it168.com/a2012/0207/1307/000001307969.shtml

		bindBt = (Button) findViewById(R.id.bindBt);
		unbindBt = (Button) findViewById(R.id.unbindBt);
		exitBt = (Button) findViewById(R.id.exitBt);
		resultBt = (Button) findViewById(R.id.resultBt);
		intent.setAction("com.lwx.service.MYSERVICE");
		bindBt.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Log.e("", "绑定服务连接");
				bindService(intent, connection, Service.BIND_AUTO_CREATE);// 0不自动创建服务
			}
		});
		resultBt.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				Toast.makeText(ServiceActivity.this, "结果是:"+binder.getCount(), Toast.LENGTH_LONG).show();
			}
		});

		unbindBt.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				unbindService(connection);
			}
		});
		
		
		exitBt.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				//退出组件 自动触发服务的unbind和ondestroy方法
				finish();
			}
		});

	}


总结:要创建一个服务对象,则类似Activity类似,需要继承Service.同时在AndroidManifest.xml 做相应的定义
接着,通过intent.setAction来跳转。至于如何创建service则有两种方式。start和bind方式。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值