《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();}

========================================

更多相关文章

  1. Android(安卓)PackageManagerService(四)本地安装流程详解
  2. Android中Cursor 的一些方法
  3. Android(安卓)第三方 Jar 的 Link 与问题:Unable to execute dex
  4. Android(安卓)中获取控件宽和高的方法(详细解析)
  5. 查看Android的appPackage和Activity的多种方法
  6. Android异常总结---type Status report message HTTP method GET
  7. 【Android】ArrayList通过remove方法删除元素对象源码分析
  8. Android(安卓)O media difference(add HIDL)
  9. Android标准调用播放器流程

随机推荐

  1. 只发起单独activity
  2. 【Android】常见布局xml参数详解
  3. Android(安卓)debug.keystore的key和密码
  4. 【Android】利用Android的网格布局写一个
  5. Android(安卓)EditText 不自动获取焦点(
  6. sad
  7. Android数据加密之Des加密
  8. Choreographer 翩翩起舞
  9. Android更新Ui进阶精解(二)
  10. Android(安卓)开机画面