Service中的bindService、unbindService的使用及使用示例

通过startService()和stopService()启动关闭服务。适用于服务和访问者之间没有交互的情况,如果服务和访问者之间需要方法调用或者传递参数,则需要使用bindService和unbindService()方法启动关闭服务于。

  采用Cotext.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法,这个时候访问者和服务会绑定在一起。如果访问者要与服务进行通信,那么,onBind()必须防护Ibinder对象,如果访问者退出了,系统会先调用服务的onUnbind()方法,接着调用onDestroy()方法,如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定。如果访问者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。

  其一般的结构如下

    

对上图做个简单介绍,首先是在MyActivity中使用bindService()启动服务。如果Service中启动成功,那么在bindService方法中的第二个参数,会返回在MyService中的onBind()方法中的IBinder对象。MyBinder对象由我们实现Binder类的。


    

发布了110 篇原创文章 · 获赞 32 · 访问量 41万+
展开阅读全文

安卓,service,不调用ondestory()方法,并强退,怎么办?

11-25

代码如下,本应按下第二个按钮就调用service的ondestory方法,但没有,并且会强退。 activity_main.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:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="打开service"/> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="销毁service"/> </LinearLayout> java代码如下: package com.example.test_service; import android.os.Bundle; import android.widget.*; import android.app.Activity; import android.view.Menu; import android.app.Service; import android.os.IBinder; import android.content.Intent; import android.view.View.OnClickListener; import android.view.View; public class MainActivity extends Activity { Button but=null; Button but2=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); but=(Button)super.findViewById(R.id.button); but2=(Button)super.findViewById(R.id.button2); but.setOnClickListener(new OnClickListenerimpl()); but2.setOnClickListener(new OnClickListenerimpl2()); } @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; } class OnClickListenerimpl implements OnClickListener { public void onClick(View v) { startService(new Intent(MainActivity.this,Test.class)); } } class OnClickListenerimpl2 implements OnClickListener { public void onClick(View v) { stopService(new Intent(MainActivity.this,Test.class)); } } } 另外该service的类如下: package com.example.test_service; import android.app.Service; import android.content.Intent; import android.os.IBinder; public class Test extends Service { public IBinder onBind(Intent intent) { return null; } public void onCreate() { System.out.println("现在create了service"); } public int onStartCommand(Intent intent,int flag,int startId) { System.out.println("现在启动service,启动的id是"+startId); return Service.START_CONTINUATION_MASK; } public void onDestory() { System.out.println("现在销毁service"); } } 另外,在AndroidMainfest.xml中已添加如下语句: <service android:name=".Test"/> 按下“打开service”按钮,logcat如下图: ![图片说明](https://img-ask.csdn.net/upload/201511/25/1448434665_954634.png) 按下“销毁service",后台并不会输出相应的信息,而是等一段时间后就会如图: ![图片说明](https://img-ask.csdn.net/upload/201511/25/1448434712_930375.png) 此时也会弹出提示框要强退: ![图片说明](https://img-ask.csdn.net/upload/201511/25/1448434738_234231.png) 请问是什么问题?应该怎么解决? 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览