本文共 3461 字,大约阅读时间需要 11 分钟。
MainActivity:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | public class MainActivity extends Activity { Mybinder mybinder = null ; ServiceConnection mConn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { } @Override public void onServiceConnected(ComponentName name, IBinder binder) { mybinder = (Mybinder) binder; //对象binder,强转为Mybinder类型 Log.e( "MainActivity" , "mybinder.getname()" ); } }; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView textView1 = (TextView) findViewById(R.id.textView1); final TextView textView2 = (TextView) findViewById(R.id.textView2); findViewById(R.id.button1).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity. this ,MyService. class ); bindService(intent, mConn, BIND_AUTO_CREATE); } }); findViewById(R.id.button2).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { unbindService(mConn); } }); findViewById(R.id.button3).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { textView1.setText(mybinder.play()); //通过mybinder调用service的方法,或者通过方法将数据传给service } }); findViewById(R.id.button4).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { textView2.setText(mybinder.pause()); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true ; } } |
MyService:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | public class MyService extends Service { public String play() { return "播放" ; } public String pause() { return "暂停" ; } class Mybinder extends Binder //Binder类继承了接口IBinder,Mybinder继承Binder类 { //在Mybinder创建方法 public String getname() { return "myBinder" ; } //调用外部方法 public String play() { return MyService. this .play(); } public String pause() { return MyService. this .pause(); } } private IBinder binder = new Mybinder(); //IBinder声明创建一个Mybinder对象 @Override public IBinder onBind(Intent intent) { Log.e( "MyService" , "onBind" ); return binder; //返回IBinder对象 } @Override public void onCreate() { Log.e( "MyService" , "onBind" ); super .onCreate(); } @Override public boolean onUnbind(Intent intent) { Log.e( "MyService" , "onUnbind" ); return super .onUnbind(intent); } @Override public void onDestroy() { Log.e( "MyService" , "onDestroy" ); super .onDestroy(); } } |
注:
service属性
android:enabled
这个属性用于指示该服务是否能够被实例化。如果设置为true,则能够被实例化,否则不能被实例化。默认值是true。
<application>元素有它自己的enabled属性,它的这个属性适用于应用中所有的组件,包括service组件。对于被启用的服务,<application>和<service>元素的enabled属性都必须是true(默认值都是true)。如果有一个元素的enabled属性被设置为false,该服务就会被禁用,而不能被实例化。
android:exported
这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互。如果设置为true,则能够被调用或交互,否则不能。设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。
它的默认值依赖与该服务所包含的过滤器。没有过滤器则意味着该服务只能通过指定明确的类名来调用,这样就是说该服务只能在应用程序的内部使用(因为其他外部使用者不会知道该服务的类名),因此这种情况下,这个属性的默认值是false。另一方面,如果至少包含了一个过滤器,则意味着该服务可以给外部的其他应用提供服务,因此默认值是true。
这个属性不是限制把服务暴露给其他应用程序的唯一方法。还可以使用权限来限制能够跟该服务交互的外部实体。