我上次面试时,就听面试官给我说unbindService后,service还是可以继续执行的。
难道说的是AIDL那种远程服务的方式?
难道说的是AIDL那种远程服务的方式?
解决方案 »
- QCOM_msm7x2xa中,原始music为什么暂停播放后1分钟才释放audiofocus焦点
- 关于数据库更新的问题
- 为什么我的android没有资源文件夹?
- popupWindow+listview高手指点
- startActivityForResult疑问
- 主线程和AsyncTask如何调用同一个函数
- Service不能启动问题
- 为什么FindViewById不用new一个对象就能直接赋值给某个引用变量?
- android library project cannot be launched
- 怎么用代ma开启强制GPU渲染?
- Android开发多层树型目录的实现
- 这两种方法获取手机当前网络的ip有何区别?
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.min.localservicedemo"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".LocalServiceDemo"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="CountService">
<intent-filter>
<action android:name="com.min.localservicedemo.CountService" />
</intent-filter>
</service>
</application>
</manifest>
通过bindService启动的服务,在unbindService后应该是可以继续运行service,今天去面试在这个问题上又被鄙视了。
在android播放器源码里好像有这个用法,我查查,这就是不重视源码的后果!
http://android.git.kernel.org/?p=platform/packages/apps/Music.git;a=tree
看了下是用AIDL远程服务的方式启动的SERVICE类MediaPlaybackService.java
http://android.git.kernel.org/?p=platform/packages/apps/Music.git;a=blob;f=src/com/android/music/MediaPlaybackService.java;h=7c0bbedbedef49bf4c38ef97fdcd0f1017bf5d35;hb=HEAD还没来得及仔细看,是不是通过在activity中获取到远程service后,bindService,这样即使unbindService后,还是可以继续运行service播放音乐?
那样再进入一流公司就容易了,现在大部分机会都是浪费掉了。回到主题,通过aidl启动的远程服务是可以在unbindService之后还可以继续运行service的吧
service和activity属于不同的进程里吧?
是service属于server程序,activity属于client端?
看了一些aidl的例子,还没有彻底弄明白。
同一个app中的service和activity属于同一个进程,也是同一个线程,但是可以通过设置属性改变。你看看下docs/guide/topics/fundamentals/services.html这个描述吧。我也只是把这个看完了,没在app中使用,刚刚入手android几个月。
service可以和activity在同一进程,也可以不在。这要看AndroidManifest.xml里面的定义。
service与server好像没有什么关系吧?前者是系统的概念,后者大多指c/s这种结构。
android自带music源码中也是先startService,然后执行bindService的
这是MusicUtils.java中定义的绑定函数bindToService,先startService,再bindService。
public static ServiceToken bindToService(Activity context, ServiceConnection callback) {
Activity realActivity = context.getParent();
if (realActivity == null) {
realActivity = context;
}
ContextWrapper cw = new ContextWrapper(realActivity);
cw.startService(new Intent(cw, MediaPlaybackService.class));
ServiceBinder sb = new ServiceBinder(callback);
if (cw.bindService((new Intent()).setClass(cw, MediaPlaybackService.class), sb, 0)) {
sConnectionMap.put(cw, sb);
return new ServiceToken(cw);
}
Log.e("Music", "Failed to bind to service");
return null;
}
本例只需要增加一个startService就可以了
tvCount = (TextView)findViewById(R.id.tvCount);
startService(new Intent("com.min.localservicedemo.CountService"));
this.bindService(new Intent("com.min.localservicedemo.CountService"),
serviceConnection, BIND_AUTO_CREATE);
缺少这个
2.当启动时,先调用startService,在调用bindService方法后,在unbindService后,会执行service的onUnbind,不会执行onDestroy方法。除非你在执行stopService.
3. 先调用startService,在调用stopService,会执行service的onDestroy方法。