Android中的服务小知识

趁着今天有空,来回顾一下Android中Service的相关知识。如有不足,敬请指正。 任何一个Android程序员都知道Service。Service作为Android的四大组件之一,在每一个应用当中都扮演着很重要的角色。它主要是在后台用来处理一些耗时的操作,以及一些需要长期运行的任务。必要的时候,我们在应用退出之后,还需要我们的Service继续执行相关的任务。 那么,Service既然如此重要,但并不是每一个程序员都能够很好地掌握它,然后利用好它(我也是)。不过今天,我将重新将Service的知识重新过滤一遍,加深自己的技术水平,也做个记录。 首先,Service最基本的用法大概就是启动一个Service了。启动Service的基本方法跟启动Activity的基本方法都是相似的,都需要使用到intent方法。下面,我写了一个基本的启动Service的方法,简单演示一下Service的启动。 这里,我新建了一个MyService类,继承自Service。然后重写了它的onCreate、onDestroy、onStartCommand、onBind方法,然后除了onBind方法之外,在每一个方法中都打印了一句话。 public class MyService extends Service { public static String mess = "Service"; @Override public void onCreate() { Log.d(mess, "onCreate: executed"); super.onCreate(); } @Override public void onDestroy() { Log.d(mess, "onDestroy: executed"); super.onDestroy(); } //start指令(command) @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(mess, "onStartCommand: executed"); return super.onStartCommand(intent, flags, startId); } @Nullable @Override public IBinder onBind(Intent intent) { return null; }} 类如上所示。 然后,在基本布局当中写了两个开启和关闭Service的button: <Button android:text="开启服务" android:id="@+id/start" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:text="关闭服务" android:id="@+id/stop" android:layout_width="match_parent" android:layout_height="wrap_content" /> 再然后,在MainActivity中进行逻辑的实现: public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button button1; private Button button2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1 = (Button) findViewById(R.id.start); button2 = (Button) findViewById(R.id.stop); button1.setOnClickListener(this); button2.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.start: Intent intent = new Intent(this,MyService.class); startService(intent); break; case R.id.stop: Intent intent1 = new Intent(this,MyService.class); stopService(intent1); break; } } 最后,在AndroidManifest.xml中进行Service的注册。 <service android:name=".MyService"></service> 然后发布就行了。可以看见,我们在两个按钮当中分别加入了开启和关闭服务的逻辑代码。这样,一个简单的Service示例代码就写好了。 我们可以看见,点击执行之后onCreate执行了,onStartCommand也执行了。但是不管你继续再点击开启服务,它还是只会提示onStartCommand执行了。这是为什么呢?因为onCreate方法只会在Service的第一次被创建的时候执行,如果当前的Service已经被创建,那么不管你怎么启动,那它的onCreate方法都是不会执行的。 下面,我们来看一下Service和Activity之间如何关联运用: 正如我前面提到的,除了onbind函数之外我都写了一个打印语句,那么这个时候,它的作用就体现出来了。对了,它就是和Activity链接的关键。然我们来重写MyService 的方法: //创建一个binder类,用于服务的绑定 class MyBinder extends Binder{ public void LogMyMethod(){ //这个方法只是用来测试 Log.d(mess, "LogMyMethod: executed "); } } 这个类当中我就写了一个测试打印的方法,只是为了演示。然后创建出相应的对象,再在onbind函数的返回中,返回这个对象。 再然后,我们需要在MainAcvity当中增加一些代码,来实现与Service的绑定。 private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mbinder = (MyService.MyBinder) service; mbinder.LogMyMethod(); } @Override public void onServiceDisconnected(ComponentName name) { Log.d("mbinddddd", "onServiceDisconnected: executed"); } }; 增加一个ServiceConnection对象,这个是用来为Activity和Service创建链接的链接对象。我们重写它里面的onServiceConnected方法,在其中将我们的MyBinder向下转型为(MyService.MyBinder) service;这样之后,我们就能使用这个对象调用我们binder中的定义的具体实现的代码。然后,在我们新增的button中编写对应的绑定服务和解绑的对应逻辑代码。 case R.id.bind: Intent bindintent = new Intent(this,MyService.class); //绑定服务之后自动创建服务对象 bindService(bindintent,connection,BIND_AUTO_CREATE); break; case R.id.unbind: unbindService(connection); break; 绑定服务跟开启服务类似,只不过是调用的方法有所差别。我们注意到,bindService函数的第三个参数是BIND_AUTO_CREATE,单从字面意思我们就能够猜到,绑定之后自动创建对象的服务对象。所以,我们可以不通过开启服务就能直接通过绑定服务来创建对应的Service对象。当我们点击按钮之后,Activity就能指定Service去调用事先在Sercice当中定义的LogMyMethod方法,从而实现了Activity和Service 的关联。另外我们知道,Service是一直存在与整个应用当中的,所以不止这一个Activity能够获取到这个Binder对象,其他Activity也能获取到。 那么,什么时候我们能够销毁这个Service呢?你或许会说直接点解关闭服务不就行了啊,如果这样,那你就需要自己去编写简单的代码实现看一看了。如果你直接使用的绑定服务,那么你直接点击解绑服务就能够实现Service的销毁。但是如果你是点击开启服务之后,然后再去绑定服务,然后再去点击解绑服务,这个时候打印是不会有ondestory的。你必须再去点击关闭服务,才能将你的Service销毁掉。这里,可能大家都有一点疑问,我说一下自己的观点:Service的Stop方法只能停止Service,并不能销毁一个与Activity产生关联的Service(如果没有与任何一个关联,那么是可以直接销毁的)。从这里我们可以看出,一个Service的被销毁的过程:如果这个Service并未与任何一个Activity产生关联,那么Stop方法是直接可以销毁这个Service对象的。如果Service与Activity产生了关联,那么只有当解除了关联之后,才能进行对象的销毁。(你们可以自己去编码尝试一下)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值