Android-Service的用法

Service是后台运行,不可见,没有界面的页面,优先级高于Activity,可以用来播放音乐、记录地理信息位置的改变、监听某种动作,类型有两种,一是本地服务,有start和bind两种启动方式,另一种是远程服务。

目标效果:

 

程序运行显示所有的按钮控件,分为两类,上边是start的启动和停止,下边是bind的启动和停止,点击输出对应的生命周期的方法内容。

1.activity_main.xml页面放置所有按钮控件。

activity_main.xml页面:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/tvStart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="Start:" />

    <Button
        android:id="@+id/btStart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/tvStart"
        android:text="StartService" />

    <Button
        android:id="@+id/btStop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/btStart"
        android:text="StopService" />

    <TextView
        android:id="@+id/tvBind"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/btStop"
        android:text="Bind:" />

    <Button
        android:id="@+id/btBind"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/tvBind"
        android:text="BindService" />

    <LinearLayout
        android:id="@+id/changeOne"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btBind"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btPrevious"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_weight="1"
            android:text="上一首" />

        <Button
            android:id="@+id/btNext"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_weight="1"
            android:text="下一首" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/changeTwo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/changeOne"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btPlay"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_weight="1"
            android:text="播放" />

        <Button
            android:id="@+id/btPause"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_weight="1"
            android:text="暂停" />
    </LinearLayout>

    <Button
        android:id="@+id/btUnBind"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/changeTwo"
        android:text="UnBindService" />

</RelativeLayout>

2.新建myStartService.java页面继承Service,重写方法start方式启动时调用。

myStartService.java页面:

package com.example.service;

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

public class myStartService extends Service{

	@Override
	public IBinder onBind(Intent arg0) {
		Log.i("MainActivity","startService--onBind()");
		return null;
	}
	@Override
	public void onCreate() {
		Log.i("MainActivity","startService--onCeate()");
		super.onCreate();
	}
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		Log.i("MainActivity","startService--onStartCommand()");
		return super.onStartCommand(intent, flags, startId);
	}
	@Override
	public void onDestroy() {
		super.onDestroy();
		Log.i("MainActivity","startService--onDestroy()");
	}
}

3.新建myBindService.java页面继承Service,重写方法,bind方式启动时调用。

myBindService.java页面:

package com.example.service;

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 myBindService extends Service{

	/*定义类继承Binder返回服务对象*/
	public class MyBinder extends Binder{
		public myBindService getService(){
			return myBindService.this;
		}
	}
	@Override
	public IBinder onBind(Intent arg0) {
		Log.i("MainActivity","bindService--onBind()");
		return new MyBinder();//实例服务对象并返回
	}
	@Override
	public void onCreate() {
		super.onCreate();
		Log.i("MainActivity","bindService--onCeate()");
	}
	@Override
	public void unbindService(ServiceConnection conn) {
		super.unbindService(conn);
		Log.i("MainActivity","bindService--unbindService()");
	}
	@Override
	public void onDestroy() {
		super.onDestroy();
		Log.i("MainActivity","bindService--onDestroy()");
	}
	public void play(){
		Log.i("MainActivity","播放");
	}
	public void pause(){
		Log.i("MainActivity","暂停");
	}
	public void previous(){
		Log.i("MainActivity","上一首");
	}
	public void next(){
		Log.i("MainActivity","下一首");
	}
}

4.对于新建的两个Service,都需要在AndroidManifest.xml页面进行注册。

AndroidManifest.xml页面:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.service"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="17"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.service.MainActivity"
            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="com.example.service.myStartService"></service>
        <service android:name="com.example.service.myBindService"></service>
    </application>

</manifest>

5.MainActivity.java页面进行点击事件的绑定。

MainActivity.java页面:

package com.example.service;

import com.example.service.myBindService.MyBinder;

import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {

	private Button btStart, btStop, btBind, btPrevious, btNext, btPlay,
			btPause, btUnBind;
	private Intent intentStart,intentBind;
	private myBindService service;

	/*得到服务对象*/
	private ServiceConnection conn=new ServiceConnection() {

		/*当启动源跟Service的连接意外丢失的时候会调用这个方法,比如当Service崩溃了或者被强行杀死了*/
		@Override
		public void onServiceDisconnected(ComponentName arg0) {
		}

		/*当启动源跟Service成功连接之后将会自动调用这个方法*/
		@Override
		public void onServiceConnected(ComponentName name, IBinder binder) {
			service=((MyBinder)binder).getService();//得到服务对象
		}
	};

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

		getId();
		bindClick();
	}

	private void getId() {
		btStart = (Button) findViewById(R.id.btStart);
		btStop = (Button) findViewById(R.id.btStop);
		btBind = (Button) findViewById(R.id.btBind);
		btPrevious = (Button) findViewById(R.id.btPrevious);
		btNext = (Button) findViewById(R.id.btNext);
		btPlay = (Button) findViewById(R.id.btPlay);
		btPause = (Button) findViewById(R.id.btPause);
		btUnBind = (Button) findViewById(R.id.btUnBind);
	}

	private void bindClick() {
		btStart.setOnClickListener(this);
		btStop.setOnClickListener(this);
		btBind.setOnClickListener(this);
		btPrevious.setOnClickListener(this);
		btNext.setOnClickListener(this);
		btPlay.setOnClickListener(this);
		btPause.setOnClickListener(this);
		btUnBind.setOnClickListener(this);
	}

	@Override
	public void onClick(View view) {
		switch (view.getId()) {
		case R.id.btStart:
			intentStart=new Intent(MainActivity.this,myStartService.class);
			startService(intentStart);
			break;
		case R.id.btStop:
			stopService(intentStart);
			break;

		case R.id.btPlay:
			service.play();
			break;
		case R.id.btPause:
			service.pause();
			break;
		case R.id.btPrevious:
			service.previous();
			break;
		case R.id.btNext:
			service.next();
			break;

		case R.id.btBind://绑定
			intentBind=new Intent(MainActivity.this,myBindService.class);
			//第一个参数为实例的intent对象,第二个参数为得到的服务对象
			bindService(intentBind, conn,Service.BIND_AUTO_CREATE);
			break;
		case R.id.btUnBind://解绑,只可点击一次,并且如果想要结束启动源,必须解绑
			unbindService(conn);
			break;
		}
	}
}

6.运行就显示目标效果了。

时间: 2024-10-16 06:06:29

Android-Service的用法的相关文章

关于Android Service的基本用法(上)(转)

相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了. Service作为Android四大组件之一,在每一个应用程序中都扮演着非常重要的角色.它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长 期运行的任务.必要的时候我们甚至可以在程序退出的情况下,让Service在后台继续保持运行状态. 不过,虽然Service几 乎被每一个Android程序员所熟知,但并不是每个人都已经将Service的各个知识点都

关于Android Service的基本用法(下)(转)

在上篇文章中我们知道了,Service其实是运行在主线程里的,如果直接在Service中处理一些耗时的逻辑,就会导致程序ANR. 让我们来做个实验验证一下吧,修改上一篇文章中创建的ServiceTest项目,在MyService的onCreate()方法中让线程睡眠60秒,如下所示: [java] view plaincopy public class MyService extends Service { ...... @Override public void onCreate() { su

Android Service生命周期及用法

Service概念及用途:Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,那 我们什么时候会用到Service呢?比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当我们退出播放音乐的应用,如果不用Service,我 们就听不到歌了,所以这时候就得用到Service了,又比如当我们一个应用的数据是通过网络获取的,不同时间(一段时间)的数据是不同的这时候我们可以 用S

Android Service完全解析,关于服务你所需知道的一切(下) (转载)

转自:http://blog.csdn.net/guolin_blog/article/details/9797169 转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在 上一篇文章中,我们学习了Android Service相关的许多重要内容,包括Service的基本用法.Service和Activity进行通信.Service的销毁方式. Service与Thread的关系.以及如何创建前台Service.以上

Android Service完全解析,关于服务你所需知道的一切(上)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了.Service作为Android四大组件之一,在每一个应用程序中都扮演着非常重要的角色.它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务.必要的时候我们甚至可以在程序退出的情况下,让Service在后台继续保持

Android Service完全解析,关于服务你所需知道的一切(下)

转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要内容,包括Service的基本用法.Service和Activity进行通信.Service的销毁方式.Service与Thread的关系.以及如何创建前台Service.以上所提到的这些知识点,基本上涵盖了大部分日常开发工作当中可能使用到的Service技术.不过关于Service其实还有一个更加

浅谈 Android Service

 浅谈Android Service的基本用法: 关于Service最基本的用法自然是启动和停止操作. 启动Service有两种方式: 1.通过startService(Intent intent)方式启动,启动时会自动执行onCreate(),onStartCommand()方法. 2.通过bindService(Intent intent,ServiceConnection connection,int flag) 第一个参数是一个Intent对象,第二个参数是连接Service的实例,

Android Service(上)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了.Service作为Android四大组件之一,在每一个应用程序中都扮演着非常重要的角色.它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务.必要的时候我们甚至可以在程序退出的情况下,让Service在后台继续保持

Android Service IPC通信之Messenger机制

概述 之前我写过一篇博客介绍Service:Android Service全面解析,里面讲过如何实现Service的跨进程(IPC)通信,主要是通过编写AIDL接口文件来实现的.本篇我们来讲讲Service IPC通信的另外一种方式-Messenger. Messenger,也称为信使,通过它可以在不同的进程间传递message对象,在message中放入我们需要传递的数据你就可以实现跨进程通信和传递数据了.所以说Messenger机制是基于消息的跨进程通信方式. 可以看到,我们可以在客户端发送

Android Service服务——初识

很抱歉(对我,也是对大家)过了两个星期说好的要发的博客迟迟没有动静,因为最近在与高等数学死磕,同时参加了一个党内的培训,所以现在的学习生活有些紧张,自己的的草稿都堆积了好几篇了,现在我就对于我应朋友之情需要完成一个android的播放器,对于其中的一些简单的要点,写一些自己的感悟. 首先我要提到的时Android  Service服务,其实我接触到Service这个概念的时间并不长,首先在做这个不能算作工程的东西时,我就想到了,android需要有这样的一个机制,通过一个程序去控制歌曲的播放,同