So it looks like I'm missing something about how to unbind from a service. 
I thought that calling unbindService with the same ServiceConnection 
instance would be enough. Looking at the output from dumpsys it looks only 
partially unbound or something. I guess this explains why it is restarted. 
How do I completely unbind?

>adb shell dumpsys activity services com.example.service
ACTIVITY MANAGER SERVICES (dumpsys activity services)
  Active services:
  * ServiceRecord{426c09c0 com.example.service/.MainService}
    intent={cmp=com.example.service/.MainService}
    packageName=com.example.service
    processName=com.example.service
    baseDir=/data/app/com.example.service-1.apk
    dataDir=/data/data/com.example.service
    app=ProcessRecord{42183390 8027:com.example.service/u0a97}
    createTime=-1m2s860ms lastActivity=-1m2s857ms
    executingStart=-3s22ms restartTime=-1m2s860ms
    startRequested=true stopIfKilled=true callStart=true lastStartId=1
    Bindings:
    * IntentBindRecord{426dda38}:
      intent={cmp=com.example.service/.MainService}
      binder=android.os.BinderProxy@42610298
      requested=true received=true hasBound=false doRebind=false

On Saturday, August 11, 2012 8:21:07 PM UTC+2, Dianne Hackborn wrote:
>
> Unless the service has something bound to it or it is started, it will not 
> be re-created.
>
> You can look at the service state with "adb shell dumpsys activity 
> services" or "adb shell dumpsys activity service <package_name or 
> service_name>".  If your service is listed there, it will show you what its 
> current state is -- what is bound to it, whether it is started, etc.
>
> On Fri, Aug 10, 2012 at 2:26 PM, Johan Appelgren 
> <[email protected]<javascript:>
> > wrote:
>
>> You're right that I'm not understanding something here, most likely it is 
>> something really obvious too. :(
>>
>> As I wrote, my understanding of what you describe is not the behavior I'm 
>> seeing with my test app on my Galaxy Nexus with Android 4.1.1 nor the 4.1.1 
>> emulator image. After I've unbound from the service, in my test I do this 
>> in the activity's onPause, when the app process is killed, it and the 
>> service is restarted. Then after that the process and service is killed and 
>> restarted every now and then, without starting the activity or any calls to 
>> startService or bindService made by any code in my test app. It starts 
>> quicker if I start a couple of different games to put some memory pressure 
>> on the system.
>>
>> Not even stopping the cached process in the Cached processes list stops 
>> it, it is restarted a little while after. Only going to the Downloaded list 
>> and pressing the Force stop button stops the stop/restart cycle. 
>>
>> Perhaps someone could look at my dummy app code and point out what I'm 
>> doing wrong. If someone does, I'm sorry for most likely wasting your time. 
>>
>> public class MainActivity extends Activity {
>>
>> @SuppressWarnings("unused")
>> private int[] mDummyData = new int[3 * 1024 * 1024];
>>  private final String TAG = "MainActivity";
>>  private boolean mBound;
>>  private boolean mCalledBind;
>> private boolean mStarted;
>>      private final ServiceConnection mConnection = new 
>> ServiceConnection() {
>>
>>         @Override
>>         public void onServiceConnected(ComponentName className, IBinder 
>> service) {
>>         Log.d(TAG, "onServiceConnected");
>>             mBound = true;
>>         }
>>
>>         @Override
>>         public void onServiceDisconnected(ComponentName arg0) {
>>         Log.d(TAG, "onServiceDisconnected");
>>         }
>>     };
>>
>>     public MainActivity(){
>>     Log.d(TAG, "ctor");
>>     }    
>>     
>>     @Override
>>     public void onCreate(Bundle savedInstanceState) {
>>         super.onCreate(savedInstanceState);
>>         setContentView(R.layout.activity_main);
>>
>>         Intent intent = new Intent(this, MainService.class);
>>
>>         Log.d(TAG, "onCreate");
>>         
>>         if (!mStarted) {
>>         Log.d(TAG, "startService");
>>          startService(intent);
>>         mStarted = true;
>>         }
>>         
>>         if (!mBound && !mCalledBind) {
>>         Log.d(TAG, "bindService");
>>             bindService(intent, mConnection, BIND_AUTO_CREATE);
>>             mCalledBind = true;
>>         }
>>     }
>>     
>>     @Override
>>     protected void onPause() {
>>     Log.d(TAG, "onPause");
>>     
>>         if (mBound) {
>>         Log.d(TAG, "unbindService");
>>             unbindService(mConnection);
>>             mBound = false;
>>              mCalledBind = false;
>>         }
>>     
>>     super.onPause();
>>     }
>>     
>>     @Override
>>     protected void onDestroy() {
>>     Log.d(TAG, "onDestroy");
>>     
>>     super.onDestroy();
>>     }
>> }
>>
>> public class MainService extends Service {
>>
>> @SuppressWarnings("unused")
>>  private int[] mDummyData = new int[1024*1024];
>>  private static final String TAG = "MainService";
>>  private final IBinder mBinder = new LocalBinder();
>>  public class LocalBinder extends Binder {
>>  MainService getService() {
>>             return MainService.this;
>>         }
>>     }
>>  @Override
>> public IBinder onBind(Intent arg0) {
>> Log.d(TAG, "onBind");
>>  return mBinder;
>> }
>>
>> @Override
>> public int onStartCommand(Intent intent, int flags, int startId) {
>>  Log.d(TAG, "onStartCommand");
>> return START_NOT_STICKY;
>> }
>>  @Override
>> public void onCreate() {
>> Log.d(TAG, "onCreate");
>>  super.onCreate();
>> }
>> }
>>
>> On Friday, August 10, 2012 8:39:46 PM UTC+2, Dianne Hackborn wrote:
>>>
>>> On Fri, Aug 10, 2012 at 12:17 AM, Johan Appelgren 
>>> <[email protected]>wrote:
>>>
>>>> Still occupies some amount of memory though, and the service's onCreate 
>>>> might not be cheap. 
>>>
>>>
>>> I'm not sure what this means...?  If you are concerned about the service 
>>> having too much overhead because you have bound to it and it doesn't need 
>>> to run just while bound, don't use BIND_AUTO_CREATE.
>>>  
>>>
>>>> Anyways, I guess this is one of those little undocumented things you 
>>>> just have to learn. Do not rely on START_NOT_STICKY if you both start and 
>>>> bind to a service if you don't want the service to stay around forever as 
>>>> a 
>>>> cached process after you've unbound it. 
>>>>
>>>
>>> Honestly I think it is pretty fully documented.  But maybe we have a 
>>> misunderstanding -- once you unbind from the service, the fact that you had 
>>> previously bound to it has no further impact on how it is handled, and if 
>>> its process is killed after that it will not be restarted.
>>>
>>> As long as you are bound to it with BIND_AUTO_CREATE, the system will 
>>> try to keep it created and if the process is killed while you remain bound 
>>> to it then it will try to restart it.
>>>
>>> As long as the service is in the started state, the system will try to 
>>> keep it created/started, and if the process is killed then it will be 
>>> restarted if it is not sticky.
>>>
>>> The decision about whether to restart the service is if either of those 
>>> conditions result in it wanting to restart it.
>>>
>>> Again starting and binding are orthogonal to each other.  You just have 
>>> to know how each works individually, and what happens in the service is 
>>> based on whether either of them drive it to need to be created.  As I think 
>>> is covered pretty fully in the documentation.
>>>
>>> -- 
>>> Dianne Hackborn
>>> Android framework engineer
>>> [email protected]
>>>
>>>
>>> Note: please don't send private questions to me, as I don't have time to 
>>> provide private support, and so won't reply to such e-mails.  All such 
>>> questions should be posted on public forums, where I and others can see and 
>>> answer them.
>>>
>>>  -- 
>> You received this message because you are subscribed to the Google
>> Groups "Android Developers" group.
>> To post to this group, send email to 
>> [email protected]<javascript:>
>> To unsubscribe from this group, send email to
>> [email protected] <javascript:>
>> For more options, visit this group at
>> http://groups.google.com/group/android-developers?hl=en
>>
>
>
>
> -- 
> Dianne Hackborn
> Android framework engineer
> [email protected] <javascript:>
>
> Note: please don't send private questions to me, as I don't have time to 
> provide private support, and so won't reply to such e-mails.  All such 
> questions should be posted on public forums, where I and others can see and 
> answer them.
>
>  

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to