Service一般都被翻译为服务的意思,在android里,service是背景执行的元件,可用於长期作业或远端处理,举个例子:Service可以在执行其他app时在背景执行音乐的播放或者档案的上传/下载之类的动作
service有两种呼叫的方式,简单来说
startService():透过startService()启动Service,即使当Activity退出,也不会影响Service的执行。
bindService():透过bindService()让Activity绑定Service,当Activity退出那麽Service也会终止执行。
Service的生命周期
我用程序先呈现startService()的生命周期
首先new一个Service的类别
MyTestService
public class MyTestService extends Service {
public MyTestService() {
}
//这是一开始就创建好的函式
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
// throw new UnsupportedOperationException("Not yet implemented");
return null;
}
//下面新增
@Override
public void onCreate() {
super.onCreate();
Log.v("MyTestService","onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.v("MyTestService","onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.v("MyTestService","onDestroy");
}
}
mainactivity
//点click1按钮会启动Service,执行MyTestService内的onCreate()、onStartCommand()
public void click1(View view) {
Intent intent =new Intent(this,MyTestService.class);
startService(intent);
}
//点click2按钮会关闭Service後,执行MyTestService内的onDestroy()
public void click2(View view) {
Intent intent =new Intent(this,MyTestService.class);
stopService(intent);
}
}
Log结果,第一次click1会先执行MyTestService内的onCreate()、onStartCommand(),之後再点click1只会出现onStartCommand()
bindService()的生命周期:
首先创一个ServiceConnection函式,这个函式会接收到由 MyTestService 内的onBind() 所丢出来的 Ibinder 物件,利用这 IBinder 物件取得 Service 物件,就可以直接操作 Service 内各个 public 的 method。
private ServiceConnection mServiceConnection =new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myTestService = ((MyTestService.LocalBinder)service).getTestService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
MyTestService
public class MyTestService extends Service {
public MyTestService() {
}
public class LocalBinder extends Binder //宣告一个继承 Binder 的类别 LocalBinder
{
MyTestService getTestService()
{
return MyTestService.this;
}
}
private IBinder mBinder =new LocalBinder();
public void Msg()
{
Log.d("MyTestService", "Msg()");
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
// throw new UnsupportedOperationException("Not yet implemented");
return mBinder;
}
@Override
public boolean onUnbind(Intent intent){
return super.onUnbind(intent);
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
private MyTestService myTestService;
private Boolean mBoo;//判断是否绑定
private ServiceConnection mServiceConnection =new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myTestService = ((MyTestService.LocalBinder)service).getTestService();
mBoo =true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
mBoo =false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onStart() {
super.onStart();
Intent intent =new Intent(this,MyTestService.class);
bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
super.onStop();
unbindService(mServiceConnection);
mBoo=false;
}
//当mBoo有绑定 且 myTestService !=null,就执行myTestService的Msg();
public void click1(View view) {
if (mBoo && myTestService !=null){
myTestService.Msg();
}
}
}
Log结果
那麽Service的介绍就到此结束~
<<: [Day10] swift & kotlin 实作篇!(1) 开发工具与环境安装
这是 Roblox 从零开始系列,效果章节的第八个单元,今天将说明如何透过粒子来实作爆炸效果 Par...
这篇的主题是因为有朋友提到 Database vs Data warehouse 的差别,所以就开始...
全彩 LED 光线变化 ( 共阳极 ) 教学原文参考:全彩 LED 光线变化 ( 共阳极 ) 全彩 ...
阵列中常用的方法还有 filter() 跟 map(),filter() 方法可以根据指定的筛选条件...
装extension的时候失败了QQ E: Unable to locate package php...