Android(安卓)调用Remote Service方法
16lz
2021-01-26
《Android开发入门与实践》上的ex_TestServiceHolder例子在AndroidManifest.xml中 <service android:enabled="true" android:name=".TestService" android:process=":remote"/> 这是一个远程方法,是无法直接从Activity调用Service中的方法的。 根据网上的资料写了一个AIDL文件,实现了远程调用。在这里记录备忘。
===============================================================
=======================================
========================================
package com.iceskysl.TestServiceHolder; import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class TestServiceHolder extends Activity { private boolean _isBound; private ITestService _boundService = null; private static final String TAG = "TestServiceHolder"; private IBinder _service; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setTitle("Service Test"); initButtons(); } private ServiceConnection _connection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { _boundService = ITestService.Stub.asInterface(service); Toast.makeText(TestServiceHolder.this, "Service connected", Toast.LENGTH_SHORT).show(); Log.e(TAG, "=====>onServiceConnected()"); } public void onServiceDisconnected(ComponentName className) { // unexpectedly disconnected,we should never see this happen. _boundService = null; Toast.makeText(TestServiceHolder.this, "Service connected", Toast.LENGTH_SHORT).show(); Log.e(TAG, "<=====onServiceDisconnected()"); } }; private void initButtons() { Button buttonStart = (Button) findViewById(R.id.start_service); buttonStart.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { startService(); } }); Button buttonStop = (Button) findViewById(R.id.stop_service); buttonStop.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { stopService(); } }); Button buttonBind = (Button) findViewById(R.id.bind_service); buttonBind.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { bindService(); } }); Button buttonUnbind = (Button) findViewById(R.id.unbind_service); buttonUnbind.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { unbindService(); } }); } private void startService() { Intent i = new Intent(this, TestService.class); this.startService(i); } private void stopService() { Intent i = new Intent(this, TestService.class); this.stopService(i); } private void bindService() { Intent i = new Intent(this, TestService.class); bindService(i, _connection, Context.BIND_AUTO_CREATE); _isBound = true; } private void unbindService() { if (_boundService != null) { try { Log.e(TAG,"_boundService.getCount() = "+ _boundService.getCount()); } catch (RemoteException e) { e.printStackTrace(); } } if (_isBound) { unbindService(_connection); _isBound = false; } }}
===============================================================
package com.iceskysl.TestServiceHolder; import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;public class TestService extends Service { private static final String TAG = "TestService"; private NotificationManager _nm; private boolean threadEnable = true; private int i = 0; private ITestService.Stub serviceBinder = new ITestService.Stub() { @Override public int getCount() throws RemoteException { // TODO Auto-generated method stub return i; } }; @Override public IBinder onBind(Intent i) { Log.e(TAG, "============> TestService.onBind"); return serviceBinder; } @Override public boolean onUnbind(Intent i) { Log.e(TAG, "============> TestService.onUnbind"); return false; } @Override public void onRebind(Intent i) { Log.e(TAG, "============> TestService.onRebind"); } @Override public void onCreate() { Log.e(TAG, "============> TestService.onCreate"); _nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); showNotification(); new Thread() { public void run() { try { while (threadEnable) { sleep(1000); Log.d(TAG, "Count = " + (++i)); } } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); } @Override public void onStart(Intent intent, int startId) { Log.e(TAG, "============> TestService.onStart"); } @Override public void onDestroy() { _nm.cancel(R.string.service_started); threadEnable = false; Log.e(TAG, "============> TestService.onDestroy"); } private void showNotification() { Notification notification = new Notification(R.drawable.face_1, "Service started", System.currentTimeMillis()); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, TestServiceHolder.class), 0); // must set this for content view, or will throw a exception notification.setLatestEventInfo(this, "Test Service", "Service started", contentIntent); _nm.notify(R.string.service_started, notification); } public int getCount() { return i; }}
=======================================
ITestService.aidl package com.iceskysl.TestServiceHolder; interface ITestService{ int getCount();}
========================================
更多相关文章
- Android(安卓)PackageManagerService(四)本地安装流程详解
- Android中Cursor 的一些方法
- Android(安卓)第三方 Jar 的 Link 与问题:Unable to execute dex
- Android(安卓)中获取控件宽和高的方法(详细解析)
- 查看Android的appPackage和Activity的多种方法
- Android异常总结---type Status report message HTTP method GET
- 【Android】ArrayList通过remove方法删除元素对象源码分析
- Android(安卓)O media difference(add HIDL)
- Android标准调用播放器流程