一、Service
-后台运行,不可见,没有界面
-优先级高于Activity,Android系统在内存不足时会杀一些等级比较低的Activity
1. 用途:播放音乐、记录地理信息位置的改变、监听某种动作...
2. 注意:-Service运行在主线程,不能用它来做耗时的请求或者动作。
-可以在服务中开一个线程,在线程中做耗时动作
3. 类型
(1)本地服务(Local Service) 应用程序内部
-start方式启动:startService ;stopService stopSelf stopSelResult
服务跟启动源没有任何联系、无法得到服务对象
-Bind方式启动 bindService ; unbindService 停止前先解绑定
通过Ibinder接口实例,返回一个ServiceConnection对象给启动源、通过ServiceConnection对象的相关方法可以得到Service对象。
(2)远程服务(Remote Service)Android系统内部的应用程序之间
-定义IBinder接口
二、实例
1.start方式启动Service
新建Service的派生类,命名为MyStartService ,重写onBind()
public class MyStartService extends Service{
public IBinder onBind(Intent intent){
return ;
}
//在权限xml文件中的application标签内添加
public void onCreate(){
}
public int onStartCommand(Intent intent,int flags,int startId){
}
public void onDestroy(){
}
}
//在Acitvity中启动Service
Intent intent1 = new Intent(xxxActivity.this,MyStartService.class);
startService(intent1);
//停止Service
stopService(intent1);
//新建BindService派生类,MyBindService public class MyBindService extends Service{ public IBinder onBind(Intent intent){ } public void onCreate(){ } public void onDestroy(){ } public void unbindService(ServiceConnection conn){ } } //同样需要注册在application标签内
完整的代码intent2 = new Intent(xxxActivity.this,MyBindService.class); bindService(intent2,null,Service.BIND_AUTO_CREATE); //解绑定服务,不能连续多次unbind unbindService(null);
package com.example.servicedemo; 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{ @Override public void onCreate() { // TODO Auto-generated method stub Log.i("info", "BindService--onCreate()"); super.onCreate(); } public class MyBinder extends Binder{ public MyBindService getService(){ return MyBindService.this; } } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub Log.i("info", "BindService--onBind()"); return new MyBinder(); } @Override public void unbindService(ServiceConnection conn) { // TODO Auto-generated method stub Log.i("info", "BindService--unbindService()"); super.unbindService(conn); } @Override public void onDestroy() { // TODO Auto-generated method stub Log.i("info", "BindService--onDestroy()"); super.onDestroy(); } public void Play(){ Log.i("info", "播放"); } public void Pause(){ Log.i("info", "暂停"); } public void Pervious(){ Log.i("info", "上一首"); } public void next(){ Log.i("info", "下一首"); } }
package com.example.servicedemo; import com.example.servicedemo.MyBindService.MyBinder; import android.app.Activity; import android.app.Service; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.view.Menu; import android.view.View; public class MainActivity extends Activity { Intent intent1; Intent intent2; MyBindService service; ServiceConnection conn = new ServiceConnection() { @Override//当服务跟启动源断开的时候 会自动回调 public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } @Override//当服务跟启动源连接的时候 会自动回调 public void onServiceConnected(ComponentName name, IBinder binder) { // TODO Auto-generated method stub service = ((MyBinder)binder).getService(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void doClick(View v){ switch (v.getId()) { case R.id.start: intent1 = new Intent(MainActivity.this, MyStartService.class); startService(intent1); break; case R.id.stop: stopService(intent1); break; case R.id.play: service.Play(); break; case R.id.pause: service.Pause(); break; case R.id.pervious: service.Pervious(); break; case R.id.next: service.next(); break; case R.id.bind: intent2 = new Intent(MainActivity.this, MyBindService.class); startService(intent2); bindService(intent2, conn, Service.BIND_AUTO_CREATE); break; case R.id.unbind: unbindService(conn); break; } } @Override protected void onDestroy() { // TODO Auto-generated method stub stopService(intent2); unbindService(conn); super.onDestroy(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
-