【讨论】通过bindService启动的service,在unbindService后service也结束了 我上次面试时,就听面试官给我说unbindService后,service还是可以继续执行的。难道说的是AIDL那种远程服务的方式? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这是AndroidManifest.xml文件的配置,有需要运行的朋友可以直接拷贝<?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创建的服务(但仍然通过bindService得到了服务对象),就可能unbindService后还在运行,否则应该是结束掉了。 嗯。通过bindService启动的服务,在unbindService后应该是可以继续运行service,今天去面试在这个问题上又被鄙视了。在android播放器源码里好像有这个用法,我查查,这就是不重视源码的后果! android自带的music源码http://android.git.kernel.org/?p=platform/packages/apps/Music.git;a=tree看了下是用AIDL远程服务的方式启动的SERVICE类MediaPlaybackService.javahttp://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播放音乐? 呵呵,建议你到google面试,百度那些人技术不行啊 目前还是好好的做两年android,提高水平,而不是像现在只懂皮毛。那样再进入一流公司就容易了,现在大部分机会都是浪费掉了。回到主题,通过aidl启动的远程服务是可以在unbindService之后还可以继续运行service的吧service和activity属于不同的进程里吧?是service属于server程序,activity属于client端?看了一些aidl的例子,还没有彻底弄明白。 通过bindService启动的service有一个bound计数,当计数为0时,service就destroy了。同一个app中的service和activity属于同一个进程,也是同一个线程,但是可以通过设置属性改变。你看看下docs/guide/topics/fundamentals/services.html这个描述吧。我也只是把这个看完了,没在app中使用,刚刚入手android几个月。 谢谢,以前看到过bindService有个计数来判断是否还有没有调用者,但没有具体用过,还是记忆不深刻啊。 aidl只是一个stub,相当于代理,与服务没有关系。不会影响服务的生命周期。service可以和activity在同一进程,也可以不在。这要看AndroidManifest.xml里面的定义。service与server好像没有什么关系吧?前者是系统的概念,后者大多指c/s这种结构。 多谢,那该如何控制通过bindService启动的服务,在unbindService后不结束service,让service继续运行呢? 这个对我来说很难,还没有想到什么办法。因为这是android系统决定要结束服务的,在所有连接都解绑之后。 谢谢。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; } 的确是在bindService之前先startService,当activity结束时,unbindService后service还是可以继续运行。本例只需要增加一个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); <uses-permission android:name=”android.permission.INTERNET” />缺少这个 有三种情况:如果直接使用服务,则没有必要进行绑定,但是如果要使用服务里面的方法,则要进行绑定。具体的启动情况有下: 1.当启动时,单独调用bindService方法,在unbindService后,会执行service的onUnbind,在执行onDestroy方法。 2.当启动时,先调用startService,在调用bindService方法后,在unbindService后,会执行service的onUnbind,不会执行onDestroy方法。除非你在执行stopService. 3. 先调用startService,在调用stopService,会执行service的onDestroy方法。 unbindservice 只会执行一次 。。很奇怪 非常感谢, 正在为bindService发愁呢。 unbind之后虽然不会停止服务,但是会把service重新create,这个要怎么解决啊 安卓如何实现3D动画 新手,求高人指点android开发 radio切换为前台播放时却丢失了音频焦点问题 无网络,android手机显示自己设定的图片,不显示找不到网页 关于package文件夹延伸的有关android安装、平台架构等问题 android 服务器端 http API的开发 调用Intent.ACTION_VIEW的问题 android 翻页卷曲效果 android 视频播放器获取视频总时间 android root权限后隐藏第三方应用程序 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方法。