我上次面试时,就听面试官给我说unbindService后,service还是可以继续执行的。
难道说的是AIDL那种远程服务的方式?

解决方案 »

  1. 这是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> 
      

  2. 如果不是通过bindService创建的服务(但仍然通过bindService得到了服务对象),就可能unbindService后还在运行,否则应该是结束掉了。
      

  3. 嗯。
    通过bindService启动的服务,在unbindService后应该是可以继续运行service,今天去面试在这个问题上又被鄙视了。
    在android播放器源码里好像有这个用法,我查查,这就是不重视源码的后果!
      

  4. android自带的music源码
    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播放音乐?
      

  5. 呵呵,建议你到google面试,百度那些人技术不行啊
      

  6. 目前还是好好的做两年android,提高水平,而不是像现在只懂皮毛。
    那样再进入一流公司就容易了,现在大部分机会都是浪费掉了。回到主题,通过aidl启动的远程服务是可以在unbindService之后还可以继续运行service的吧
    service和activity属于不同的进程里吧?
    是service属于server程序,activity属于client端?
    看了一些aidl的例子,还没有彻底弄明白。
      

  7. 通过bindService启动的service有一个bound计数,当计数为0时,service就destroy了。
    同一个app中的service和activity属于同一个进程,也是同一个线程,但是可以通过设置属性改变。你看看下docs/guide/topics/fundamentals/services.html这个描述吧。我也只是把这个看完了,没在app中使用,刚刚入手android几个月。
      

  8. 谢谢,以前看到过bindService有个计数来判断是否还有没有调用者,但没有具体用过,还是记忆不深刻啊。
      

  9. aidl只是一个stub,相当于代理,与服务没有关系。不会影响服务的生命周期。
    service可以和activity在同一进程,也可以不在。这要看AndroidManifest.xml里面的定义。
    service与server好像没有什么关系吧?前者是系统的概念,后者大多指c/s这种结构。
      

  10. 多谢,那该如何控制通过bindService启动的服务,在unbindService后不结束service,让service继续运行呢?
      

  11. 这个对我来说很难,还没有想到什么办法。因为这是android系统决定要结束服务的,在所有连接都解绑之后。
      

  12. 谢谢。
    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;
        }
      

  13. 的确是在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);
      

  14. <uses-permission android:name=”android.permission.INTERNET” />
    缺少这个
      

  15. 有三种情况:如果直接使用服务,则没有必要进行绑定,但是如果要使用服务里面的方法,则要进行绑定。具体的启动情况有下: 1.当启动时,单独调用bindService方法,在unbindService后,会执行service的onUnbind,在执行onDestroy方法。
     2.当启动时,先调用startService,在调用bindService方法后,在unbindService后,会执行service的onUnbind,不会执行onDestroy方法。除非你在执行stopService.
     3. 先调用startService,在调用stopService,会执行service的onDestroy方法。
      

  16. unbindservice 只会执行一次 。。很奇怪
      

  17. 非常感谢, 正在为bindService发愁呢。
      

  18. unbind之后虽然不会停止服务,但是会把service重新create,这个要怎么解决啊
      

类似问题 »