开启方式:
startService:该方法开启的服务所在的进程属于服务进程,activity一旦启动服务,服务就和activity没有关系了。访问者与服务无关,则关闭访问者之后,服务能够继续运行
bindService:该方法开启的服务所在的进程不在服务进程,activity与服务建立连接,activity一旦死亡,服务业死亡,服务和activity同生共死。访问者与服务有关(比如访问者需要调用服务提供的方法),则
关闭访问者后,服务也要关闭。
清单文件配置
<service android:name="com.ldw.startService.MyService"></service>
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=".MainActivity"
android:orientation="vertical"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始服务"
android:onClick="start"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止服务"
android:onClick="stop"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="绑定服务"
android:onClick="bind"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="解绑服务"
android:onClick="unbind"
/>
</LinearLayout>
MainActivity.java
package com.ldw.startService;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
public class MainActivity extends Activity {
private Intent intent;
private MyServiceConn conn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent(this, MyService.class);
conn = new MyServiceConn();
}
//开启服务
public void start(View v){
startService(intent);
}
//关闭服务
public void stop(View v){
stopService(intent);
}
//绑定服务
public void bind(View v){
bindService(intent, conn, BIND_AUTO_CREATE);
}
//解绑服务
public void unbind(View v){
unbindService(conn);
}
class MyServiceConn implements ServiceConnection{
//服务链接成功的时候此方法被调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
}
//服务失去连接的时候此方法被调用
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
}
MyService.java
package com.ldw.startService;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class MyService extends Service {
//绑定的时候调用
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("onBind方法被调用");
return null;
}
//解绑的时候调用
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("onUnbind方法被调用");
return super.onUnbind(intent);
}
//服务创建的额时候被调用
@Override
public void onCreate(){
super.onCreate();
System.out.println("onCreate方法被调用");
}
//可见没有焦点的时候调用,因为服务本身没有焦点,这个方法过时了,现在都用下面的onStartCommand方法
@Override
public void onStart(Intent intent, int startId){
super.onStart(intent, startId);
System.out.println("onStart方法被调用");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId){
System.out.println("onStartCommand方法被调用");
return super.onStartCommand(intent, flags, startId);
}
//服务销毁的时候调用
@Override
public void onDestroy(){
super.onDestroy();
System.out.println("onDestroy方法被调用");
}
}
activity不能直接访问service里面的方法,需要bindService提供的中间方法间接访问服务里面的方法,服务里卖弄Ibinder()方法有个返回值,利用返回值作为中间方法来访问服务里面的方法。
清单文件:
<service android:name="com.ldw.startService.MyService"></service>
activity_mian.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=".MainActivity"
android:orientation="vertical"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="调用服务"
android:onClick="click"
/>
</LinearLayout>
MainActivity.java
package com.ldw.startService;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import com.ldw.startService.MyService.zhongjian;
public class MainActivity extends Activity {
private Intent intent;
private MyServiceConn conn;
publicBusiness zj;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent(this, MyService.class);
conn = new MyServiceConn();
//绑定服务
bindService(intent, conn, BIND_AUTO_CREATE);
}
//开启服务
public void click(View v){
//调用服务里面的方法,zj是接口类型,来限制访问服务里面的方法
zj.diao();
}
class MyServiceConn implements ServiceConnection{
//服务链接成功的时候此方法被调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
zj = (publicBusiness) service;
}
//服务失去连接的时候此方法被调用
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
}
MyService.java
package com.ldw.startService;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.Binder;
public class MyService extends Service {
//绑定的时候调用,onBind是系统调用
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("onBind方法被调用");
//返回一个Binder对象,zhongjian继承了Binder方法
return new zhongjian();
}
//通过实现接口里面的方法来限制zhongjian里方法的访问
class zhongjian extends Binder implements publicBusiness{
public void diao(){
//访问服务里面的方法
beidiaoyong1();
}
//接口里面不定义这个方法,避免activity随便使用这个方法
public void beidiaoyong2(){
System.out.println("beidiaoyong2方法被调用");
}
}
public void beidiaoyong1(){
System.out.println("beidiaoyong1方法被调用");
}
}
publicBusiness.java
package com.ldw.startService;
//定义接口,里面只申明服务里面想被访问的方法
public interface publicBusiness {
void diao();
}