android的service

package com.service.service;

import com.example.service.R;

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.IBinder;
import android.os.RemoteException;

import android.view.View;
import android.widget.Toast;
/**
 * service组件
 * 1.定义一个类继承Service类
 * Service两种启动方式
 * 	<1>.start
 * 	<2>.onBind
 * 服务对象同时只有一个
 * 默认情况下,一个started的service与启动它的应用组件在同一线程中,
 * 所以如果我们使用service来完成一些好使的操作任务时,就会阻塞主线程
 * 那我们就必须在线程中来处理耗时任务
 * 停止一个服务的两种方法
 * <1>.在外部使用stopService()
 * <2>.在服务类内部使用stopSelf()
 * 
 * IntentService
 * 该类型的service会在单独的线程中执行任务,任务完成后会自动结束service
 * 当我们有需要这样一次性完成的任务就可以使用IntentService来完成
 * 
 * 
 * 
 * IPC(进程间的通讯)
 * AIDL(android接口定义语言)
 * 使用aidl定义业务接口,通过ADT工具来生成一个java类,此类实现了进程间远程通讯的代理
 * 编写自己的业务类(继承生成的类中的stub存根)来实现业务接口
 * 再通过绑定service的方式来暴露此业务对象给其他组件提供功能
 * 
 * 调用者组件通过servuce方法绑定服务,从而可以获取绑定成功后的远程业务对象或本地对象
 * 可以调用相关的功能
 * 注意:一般在使用完绑定服务后,需要解除绑定
 * 
 * 自定义AIDL对象
 * 1.需要自自定义的类型上实现Parcelable接口
 * 2.需要定义一个aidl文件来申明自定义类型(在student。aidl文件中申明 parcelable Student;)
 * 3.在使用该自定义类型时必须使用import语句导入该自定义类型,否则报错
 * 
 * 
 * 
 * 使用started与bing服务之间的区别
 * 使用started会一直运行在后台,需要服务本身或外部组件停止服务才会结束运行
 * 通过bind的服务,它的生命周期依赖绑定的组件,
 * 1.started服务可以给启动的对象传递参数,但无法获取服务中的方法返回
 * 2.可以给启动的服务对象传递参数,也可以通过绑定的业务对象获取返回结果
 * 在实际应用中的使用技巧
 * 1.第一次先使用started来启动一个服务,
 * 之后可以使用绑定的方式绑定服务,从而可以直接调用业务方法返回值
 * */
public class MainActivity extends Activity {
	private IPerson person;    //要使用的业务对象接口
	boolean flag=false;
	//服务连接对象
	private ServiceConnection serviceConnection=new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			//当服务异常终止时会调用,注意:解除绑定服务时不会调用
			System.out.println("onServiceDisconnected");
			flag=false;
		}

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			//绑定成功后服务会回调该方法,自动传入IBinder对象
			System.out.println("onServiceConnected");
			person= IPerson.Stub.asInterface(service);
			System.out.println(person);
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	/**
	 * 启动一个服务
	 * */
	public void start1(View view){
		System.out.println("start1");
		Intent intent=new Intent(this,HelloService.class);
		startService(intent);
	}
	public void stop(View view){
		System.out.println("stop");
		Intent intent=new Intent(this,HelloService.class);
		stopService(intent);
	}
	public void start2(View view){
		Intent intent=new Intent(this,HelloIntentService.class);
		startService(intent);
	}
	//绑定一个服务
	public void bindService(View view){
		System.out.println("bindService");
		Intent intent=new Intent(this,MyService.class);
		//参数(1.intent对象,2.服务连接对象,3.绑定服务的标记)
		flag=bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
	}
	//解除绑定服务
	public void unBindService(View view){
		if(flag){
			unbindService(serviceConnection);
			flag=false;

		}

	}
	//调用远程业务对象方法(或是本地业务)
	public void callPerson(View view) throws RemoteException{
		person.setName("张三");
		person.setAge(21);
		person.setSex("男");
		String s=person.getPerson();
		Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
	}
	

activity_main.xml

<LinearLayout 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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.service.service.MainActivity" 
    android:orientation="vertical"
    >

   <Button 
       android:id="@+id/activity1_button1"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="启动service1"
       android:onClick="start1"
       
       />
    <Button 
       android:id="@+id/activity1_button2"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="停止service1"
       android:onClick="stop"
       
       />
    
    

    <Button 
       android:id="@+id/activity1_button3"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="startIntentService"
       android:onClick="start2"
       
       />
    
     <Button 
       android:id="@+id/activity1_button4"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="绑定Service"
       android:onClick="bindService"
       
       />
      <Button 
       android:id="@+id/activity1_button5"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="解绑Service"
       android:onClick="unBindService"
       
       />
      
      
       <Button 
       android:id="@+id/activity1_callPerson"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="调用业务对象Person的方法"
       android:onClick="callPerson"
       
       />
</LinearLayout>

HelloService

package com.service.service;

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

public class HelloService extends Service{
	private PersonImpl personImpl;
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return new PersonImpl();
	}
	//创建服务时调用
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		Log.i("HelloService", "HelloServiceOnCreate");
	}
	//销毁服务时调用
	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Log.i("HelloService", "HelloServiceONDestory");
	}
	//服务执行时的操作
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		Log.i("HelloService", "HelloServiceONStartCommand");
		System.out.println("HelloServiceONStartCommand");
		new Thread(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				int i=0;
				for(;i<10;i++){
					System.out.println(Thread.currentThread().getName()+":"+i);
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				//HelloService.this.stopSelf(); //停止服务
			}
		}).start();

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

IPerson.aidl文件

package com.service.service;

interface IPerson {
	void setName(String name);
	void setSex(String sex);
	void setAge(int age);
	String getPerson();
}

PersonImpl

package com.service.service;

import android.os.RemoteException;

public class PersonImpl extends IPerson.Stub {
	private String name;
	private String sex;
	private int age;
	@Override
	public void setName(String name) throws RemoteException {
		// TODO Auto-generated method stub
		this.name=name;
	}

	@Override
	public void setSex(String sex) throws RemoteException {
		// TODO Auto-generated method stub
		this.sex=sex;
	}

	@Override
	public void setAge(int age) throws RemoteException {
		// TODO Auto-generated method stub
		this.age=age;
	}

	@Override
	public String getPerson() throws RemoteException {
		// TODO Auto-generated method stub
		return "name="+name+"sex="+sex+"age="+age;
	}

}


第二种:继承IntentService

HelloIntentService

package com.service.service;

import android.app.IntentService;
import android.content.Intent;

public class HelloIntentService extends IntentService{

	public HelloIntentService() {
		super("IntentSerice");
		// TODO Auto-generated constructor stub
	}
	//该方法会在一个单独的线程中执行,来完成工作任务
	//任务结束后,该service会自动停止
	@Override
	protected void onHandleIntent(Intent intent) {
		// TODO Auto-generated method stub
		for(int i=0;i<10;i++){
			System.out.println(Thread.currentThread().getName()+":"+i);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		System.out.println("OnDestory");
	}

}

所有的service需要在清单文件中申明

<service android:name="com.service.service.HelloService"></service>

<service android:name="com.service.service.HelloIntentService"></service>

使用onBind方式

package com.service.service;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
/**
 * 实现一个绑定服务
 * 
 * */
public class MyService extends Service{
	private PersonImpl personImpl;
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		System.out.println("MyServiceOnCreate()");
	}
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		System.out.println("MyServiceOnBind()");
		personImpl=new PersonImpl();
		return personImpl;

	}
	@Override
	public boolean onUnbind(Intent intent) {
		// TODO Auto-generated method stub
		System.out.println("MyServiceOnUnBind()");
		return super.onUnbind(intent);
	}

}



自定义AIDL

IStudent.aidl

package com.service.service;
import com.service.service.Student;
interface IStudent {
	void setStudnet(String name,String sex);
	Student getStudent();
}

Student.aidl

parcelable Student;

Student

package com.service.service;

import android.os.Parcel;
import android.os.Parcelable;

public class Student implements Parcelable{
	private String name;
	private String sex;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	@Override
	public int describeContents() {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public void writeToParcel(Parcel dest, int flags) {
		// TODO Auto-generated method stub
		dest.writeString("name");
		dest.writeString("sex");
	}

	 public static final Parcelable.Creator<Student> CREATOR
     = new Parcelable.Creator<Student>() {
	 public Student createFromParcel(Parcel in) {
		 Student student=new Student();
		 student.setName(in.readString());
		 student.setSex(in.readString());
	     return student;
	 }

	 public Student[] newArray(int size) {
	     return new Student[size];
	 }
	};

}

StudentImpl

package com.service.service;

import android.os.RemoteException;
/**
 * 业务对象的实现
 * */
public class StudentImpl extends IStudent.Stub{
	private Student student;
	public StudentImpl(){
		student=new Student();
	}
	@Override
	public void setStudnet(String name, String sex) throws RemoteException {
		// TODO Auto-generated method stub
		this.student.setName(name);;
		this.student.setSex(sex);
	}

	@Override
	public Student getStudent() throws RemoteException {
		// TODO Auto-generated method stub
		return student;
	}

}

StudentService

package com.service.service;

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

public class StudentService extends Service{
	private StudentImpl studentImpl;
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		studentImpl=new StudentImpl();
		return studentImpl;
	}

}

使用Messenge

MessageService

package com.service.service;

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.widget.Toast;

public class MessageService extends Service{
    static final int MSG_HELLO=0x1;
	private Handler handler=new Handler(){
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case MSG_HELLO:
				Toast.makeText(MessageService.this, "hello", Toast.LENGTH_SHORT).show();
				break;

			default:
				break;
			}
		};
	};
	private Messenger messenger=new Messenger(handler);
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return messenger.getBinder();
	}

}

MessageActivity

package com.service.service;

import com.example.service.R;

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.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.view.View;
/**
 * 使用Messenger实现IPC,
 * 1.Messenger是线程安全的,在service中创建一个Messenger对象并绑定一个handle
 * 2.在onBind方法中返回messenger对象,通过messenger的getIBinder方法返回一个IBinder对象
 * 3.在调用的组件中,ServiceConnection的onServiceConnection时间中,根据IBinder对象来创建一个Messenger对象
 * 这样两个Messenger对象就同事绑定到一个IBinder对象上,从而可以底线通信,
 * 在调用组件中方法种使用Messenger的send方法来发送消息到service的Messenger对象中
 * */
public class MessageActivity extends Activity{
	private Messenger messenger;
	private boolean mBound=false;
	private ServiceConnection conn=new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			if(mBound){
				mBound=false;
			}
		}

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			messenger=new Messenger(service);
			mBound=true;
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.message_main);
	}

	public void useMessenger(View view){
		Message message=Message.obtain();
		message.what=MessageService.MSG_HELLO;
		try {
			messenger.send(message);
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		Intent intent=new Intent(this,MessageService.class);
		bindService(intent, conn, Context.BIND_AUTO_CREATE);
	}
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		if(mBound){
			unbindService(conn);
			mBound=false;
		}
	}
}

清单文件

<?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="14"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.service.service.MessageActivity"
            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 android:name="com.service.service.HelloService"></service>
       <service android:name="com.service.service.HelloIntentService"></service>
        <service android:name="com.service.service.MyService" android:process=":remote"></service>
        <service android:name="com.service.service.StudentService"></service>
        <service android:name="com.service.service.MessageService"></service>
    </application>

</manifest>
<!-- android:process=":remote"设置运行在自己的进程中 -->
时间: 2024-12-17 21:11:41

android的service的相关文章

android 远程Service以及AIDL的跨进程通信

在Android中,Service是运行在主线程中的,如果在Service中处理一些耗时的操作,就会导致程序出现ANR. 但如果将本地的Service转换成一个远程的Service,就不会出现这样的问题了. 转换成远程Service非常简单,只需要在注册Service的时候将他的android:process的属性制定成 :remote就可以了. 重新运行项目,你会发现,不会出现ANR了. 为什么将MyService转换成远程Service后就不会导致程序ANR了呢?这是由于,使用了远程Serv

android的Service的实例

package com.android.service; import android.app.IntentService;import android.content.Intent; public class HelloIntentService extends IntentService{ public HelloIntentService() {        super("HelloIntentService");        // TODO Auto-generated c

(六)Android中Service通信

一.启动Service并传递参数 传递参数时只需在startService启动的Intent中传入数据便可,接收参数时可在onStartCommand函数中通过读取第一个参数Intent的内容来实现 1.MainActivity.java package com.example.shiyanshi.serviceconnected; import android.app.Activity;import android.content.Intent;import android.os.Bundle

Android 测试Service的生命周期

1 package com.example.myapp4; 2 3 import android.support.v7.app.ActionBarActivity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.view.Menu; 7 import android.view.MenuItem; 8 import android.view.View; 9 import android.w

Android之Service通信-(2)

一.Service通过IBinder与Activity进行通信 在Service中进行下载 Service package chuiyuan.lsj.androidjava.service; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.util.Log; import android.wi

Android——判断Service是否已经启动

延续百度地图定位的Demo,采用Service来进行百度定位,并且将数据上传到服务器上遇到了一个问题:在真机中使用清理内存来关闭程序的之后,Service会被关闭,但是过几秒中,它又会自动重启:重启就算了,而且再次登陆系统的时候,又会开启一个一样的服务,在LogCat中就会看到每次都获取到两次的定位数据.然后想想是否可以在建立Service之前判断这个服务有没有被创建?只要能做这个判断,那么服务存在我们就不管它,如果不存在则创建,本着这个思路,百度发现可行(Service后台服务创建时最好都要判

Android Web Service学习总结(一)

最近学习android平台调用webWebService,学习了一篇不错的博客(http://blog.csdn.net/lyq8479/article/details/6428288),可惜是2011年时的方法,而不适合现在android4.0之后的android版本,所以通过一番学习和研究,总结如下. web Service简介 通俗的理解:通过使用WebService,我们能够像调用本地方法一样去调用远程服务器上的方法.我们并不需要关心远程的那个方法是Java写的,还是PHP或C#写的:我

如何从python代码中直接访问Android的Service

在Kivy中,通过pyjnius扩展可以间接调用Java代码,而pyjnius利用的是Java的反射机制.但是在Python对象和Java对象中转来转去总让人感觉到十分别扭.好在android提供了binder这个进程间通信的功能,Java中的Service也是基于Binder的C++代码封装来实现进程间通信的,这也为从Python代码中绕开pyjnius直接访问Java代码提供了可能,既然Java的Service是基于C++的封装来实现的,也同样可以在Python中封装同样的C++代码,这篇文

【Android】Android中Service类onStartCommand的返回值有关问题(转)

@Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("---------->>onStartCommand2"); return super.onStartCommand(intent, flags, startId); } Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象

Android中Service的使用

我个人的理解是:我们平时使用的android系统的app的后台应用,就是这个原理 可以利用Service实现程序在后台运行,依照这个原理,可以通过Service来实现关键代码的运行与实现. <一>下面大体说一下我在极客学院跟着视频做的一个Service的小实现 1,首先点击左上角file->new往下拉,看到一个Service,创建MyService.java 这个就是我们的Service服务. 后续可以在这其中添加想要在后台运行的关键代码等. 2,首先创建项目后,在layout或中的x