Android例子—Activity与Service通信

    xiaoxiao2021-03-25  16

    我们前面的操作都是通过Activity启动和停止Service,假如我们启动的是一个下载 的后台Service,而我们想知道Service中下载任务的进度!那么这肯定是需要Service 与Activity进行通信的,而他们之间交流的媒介就是Service中的onBind()方法! 返回一个我们自定义的Binder对象!

    基本流程如下:

    自定义Service中,自定义一个Binder类,然后将需要暴露的方法都写到该类中!Service类中,实例化这个自定义Binder类,然后重写onBind()方法,将这个Binder对象返回!Activity类中实例化一个ServiceConnection对象,重写onServiceConnected()方法,然后获取Binder对象,然后调用相关方法即可!

    TestService2.java:

    import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.util.Log; public class TestService2 extends Service { private final String TAG = "TestService2"; private int count; private boolean quit; // 定义onBinder方法所返回的对象 private MyBinder binder = new MyBinder(); public class MyBinder extends Binder { public int getCount() { return count; } } // 必须实现的方法,绑定改Service时回调该方法 @Override public IBinder onBind(Intent intent) { Log.i(TAG, "onBind方法被调用!"); return binder; } // Service被创建时回调 @Override public void onCreate() { super.onCreate(); Log.i(TAG, "onCreate方法被调用!"); // 创建一个线程动态地修改count的值 new Thread() { public void run() { while (!quit) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } count++; } }; }.start(); } // Service断开连接时回调 @Override public boolean onUnbind(Intent intent) { Log.i(TAG, "onUnbind方法被调用!"); return true; } // Service被关闭前回调 @Override public void onDestroy() { super.onDestroy(); this.quit = true; Log.i(TAG, "onDestroyed方法被调用!"); } @Override public void onRebind(Intent intent) { Log.i(TAG, "onRebind方法被调用!"); super.onRebind(intent); } }

    在AndroidManifest.xml中对Service组件进行注册:

    <service android:name=".TestService2" android:exported="false"> <intent-filter> <action android:name="com.jay.example.service.TEST_SERVICE2"/> </intent-filter> </service>

    MainActivity.java:

    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.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { private Button btnbind; private Button btncancel; private Button btnstatus; // 保持所启动的Service的IBinder对象,同时定义一个ServiceConnection对象 TestService2.MyBinder binder; private ServiceConnection conn = new ServiceConnection() { // Activity与Service断开连接时回调该方法 @Override public void onServiceDisconnected(ComponentName name) { System.out.println("------Service DisConnected-------"); } // Activity与Service连接成功时回调该方法 @Override public void onServiceConnected(ComponentName name, IBinder service) { System.out.println("------Service Connected-------"); binder = (TestService2.MyBinder) service; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnbind = (Button) findViewById(R.id.btnbind); btncancel = (Button) findViewById(R.id.btncancel); btnstatus = (Button) findViewById(R.id.btnstatus); final Intent intent = new Intent(); intent.setAction("com.jay.example.service.TEST_SERVICE2"); btnbind.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 绑定service bindService(intent, conn, Service.BIND_AUTO_CREATE); } }); btncancel.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 解除service绑定 unbindService(conn); } }); btnstatus.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "Service的count的值为:" + binder.getCount(), Toast.LENGTH_SHORT).show(); } }); } }

    运行截图:

    点击锁定Service:

    继续点击锁定:没任何变化

    获取当前Service的状态:

    解除绑定:

    如果我们再绑定后直接关掉Activity的话会报错, 然后会自动调用onUnbind和onDestory方法!

    转载请注明原文地址: https://ju.6miu.com/read-200094.html

    最新回复(0)