1*90c8c64dSAndroid Build Coastguard Worker /* 2*90c8c64dSAndroid Build Coastguard Worker * Copyright 2013 Google Inc. 3*90c8c64dSAndroid Build Coastguard Worker * 4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*90c8c64dSAndroid Build Coastguard Worker * 8*90c8c64dSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*90c8c64dSAndroid Build Coastguard Worker * 10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License. 15*90c8c64dSAndroid Build Coastguard Worker */ 16*90c8c64dSAndroid Build Coastguard Worker 17*90c8c64dSAndroid Build Coastguard Worker package com.example.android.basicsyncadapter; 18*90c8c64dSAndroid Build Coastguard Worker 19*90c8c64dSAndroid Build Coastguard Worker import android.app.Service; 20*90c8c64dSAndroid Build Coastguard Worker import android.content.Intent; 21*90c8c64dSAndroid Build Coastguard Worker import android.os.IBinder; 22*90c8c64dSAndroid Build Coastguard Worker import android.util.Log; 23*90c8c64dSAndroid Build Coastguard Worker 24*90c8c64dSAndroid Build Coastguard Worker /** Service to handle sync requests. 25*90c8c64dSAndroid Build Coastguard Worker * 26*90c8c64dSAndroid Build Coastguard Worker * <p>This service is invoked in response to Intents with action android.content.SyncAdapter, and 27*90c8c64dSAndroid Build Coastguard Worker * returns a Binder connection to SyncAdapter. 28*90c8c64dSAndroid Build Coastguard Worker * 29*90c8c64dSAndroid Build Coastguard Worker * <p>For performance, only one sync adapter will be initialized within this application's context. 30*90c8c64dSAndroid Build Coastguard Worker * 31*90c8c64dSAndroid Build Coastguard Worker * <p>Note: The SyncService itself is not notified when a new sync occurs. It's role is to 32*90c8c64dSAndroid Build Coastguard Worker * manage the lifecycle of our {@link SyncAdapter} and provide a handle to said SyncAdapter to the 33*90c8c64dSAndroid Build Coastguard Worker * OS on request. 34*90c8c64dSAndroid Build Coastguard Worker */ 35*90c8c64dSAndroid Build Coastguard Worker public class SyncService extends Service { 36*90c8c64dSAndroid Build Coastguard Worker private static final String TAG = "SyncService"; 37*90c8c64dSAndroid Build Coastguard Worker 38*90c8c64dSAndroid Build Coastguard Worker private static final Object sSyncAdapterLock = new Object(); 39*90c8c64dSAndroid Build Coastguard Worker private static SyncAdapter sSyncAdapter = null; 40*90c8c64dSAndroid Build Coastguard Worker 41*90c8c64dSAndroid Build Coastguard Worker /** 42*90c8c64dSAndroid Build Coastguard Worker * Thread-safe constructor, creates static {@link SyncAdapter} instance. 43*90c8c64dSAndroid Build Coastguard Worker */ 44*90c8c64dSAndroid Build Coastguard Worker @Override onCreate()45*90c8c64dSAndroid Build Coastguard Worker public void onCreate() { 46*90c8c64dSAndroid Build Coastguard Worker super.onCreate(); 47*90c8c64dSAndroid Build Coastguard Worker Log.i(TAG, "Service created"); 48*90c8c64dSAndroid Build Coastguard Worker synchronized (sSyncAdapterLock) { 49*90c8c64dSAndroid Build Coastguard Worker if (sSyncAdapter == null) { 50*90c8c64dSAndroid Build Coastguard Worker sSyncAdapter = new SyncAdapter(getApplicationContext(), true); 51*90c8c64dSAndroid Build Coastguard Worker } 52*90c8c64dSAndroid Build Coastguard Worker } 53*90c8c64dSAndroid Build Coastguard Worker } 54*90c8c64dSAndroid Build Coastguard Worker 55*90c8c64dSAndroid Build Coastguard Worker @Override 56*90c8c64dSAndroid Build Coastguard Worker /** 57*90c8c64dSAndroid Build Coastguard Worker * Logging-only destructor. 58*90c8c64dSAndroid Build Coastguard Worker */ onDestroy()59*90c8c64dSAndroid Build Coastguard Worker public void onDestroy() { 60*90c8c64dSAndroid Build Coastguard Worker super.onDestroy(); 61*90c8c64dSAndroid Build Coastguard Worker Log.i(TAG, "Service destroyed"); 62*90c8c64dSAndroid Build Coastguard Worker } 63*90c8c64dSAndroid Build Coastguard Worker 64*90c8c64dSAndroid Build Coastguard Worker /** 65*90c8c64dSAndroid Build Coastguard Worker * Return Binder handle for IPC communication with {@link SyncAdapter}. 66*90c8c64dSAndroid Build Coastguard Worker * 67*90c8c64dSAndroid Build Coastguard Worker * <p>New sync requests will be sent directly to the SyncAdapter using this channel. 68*90c8c64dSAndroid Build Coastguard Worker * 69*90c8c64dSAndroid Build Coastguard Worker * @param intent Calling intent 70*90c8c64dSAndroid Build Coastguard Worker * @return Binder handle for {@link SyncAdapter} 71*90c8c64dSAndroid Build Coastguard Worker */ 72*90c8c64dSAndroid Build Coastguard Worker @Override onBind(Intent intent)73*90c8c64dSAndroid Build Coastguard Worker public IBinder onBind(Intent intent) { 74*90c8c64dSAndroid Build Coastguard Worker return sSyncAdapter.getSyncAdapterBinder(); 75*90c8c64dSAndroid Build Coastguard Worker } 76*90c8c64dSAndroid Build Coastguard Worker } 77