开启方式:
startService:该方法开启的服务所在的进程属于服务进程,activity一旦启动服务,服务就和activity没有关系了。访问者与服务无关,则关闭访问者之后,服务能够继续运行
bindService:该方法开启的服务所在的进程不在服务进程,activity与服务建立连接,activity一旦死亡,服务业死亡,服务和activity同生共死。访问者与服务有关(比如访问者需要调用服务提供的方法),则
关闭访问者后,服务也要关闭。
清单文件配置
<service android:name="com.ldw.startService.MyService"></service>
activity_main.xnl
<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(); }