I have a service that should fix the user's location and current battery level and send it to my firebase backend. For some reason, it seems that whenever this service is enabled in my application, my application will randomly open without any user interaction (even if the user is in another application, my application will open). Does anyone know why this is happening?
Here is my code for the service:
import android.app.Service; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.location.Address; import android.location.Geocoder; import android.location.Location; import android.os.BatteryManager; import android.os.Bundle; import android.os.IBinder; import android.preference.PreferenceManager; import android.util.Log; import android.widget.Toast; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.server.converter.StringToIntConverter; import com.google.android.gms.location.LocationListener; import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationServices; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ValueEventListener; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.concurrent.TimeUnit; import static android.R.attr.lines; import static com.package.R.id.location; import static com.package.R.id.view; public class LocationBatteryService extends Service implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { private String currentUser; private String city; private String country; private float batteryLevel; private int batteryLevelInt; protected GoogleApiClient mGoogleApiClient; protected LocationRequest mLocationRequest; protected Location mCurrentLocation; List<Address> addresses; Geocoder geocoder; @Override public void onCreate() { super.onCreate(); buildGoogleApiClient(); } @Override public IBinder onBind(Intent intent) { return null; } protected synchronized void buildGoogleApiClient() { Log.i("TAG", "Building GoogleApiClient"); mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); createLocationRequest(); mGoogleApiClient.connect(); } protected void createLocationRequest() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); String locationSyncSettings = prefs.getString("location_sync_time", ""); long intervalTime = 5; if(locationSyncSettings.equals("5 minutes")) { intervalTime = 5; } if (locationSyncSettings.equals("10 minutes")) { intervalTime = 10; } if (locationSyncSettings.equals("15 minutes")) { intervalTime = 15; } if (locationSyncSettings.equals("30 minutes")) { intervalTime = 30; } if (locationSyncSettings.equals("1 hour")) { intervalTime = 60; } mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(TimeUnit.MINUTES.toMillis(intervalTime)); mLocationRequest.setFastestInterval(60000); mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); } @Override public void onConnected(Bundle connectionHint) { Log.i("TAG", "Connected to GoogleApiClient"); try { LocationServices.FusedLocationApi.requestLocationUpdates( mGoogleApiClient, mLocationRequest, this); mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); onLocationChanged(mCurrentLocation); } catch (SecurityException e){ Log.d("TAG", "Error: " + e); } } @Override public void onDestroy() { super.onDestroy(); Log.d("TAG", "You got destoryed mate"); } @Override public void onLocationChanged(Location location) { updateLocationBackend(mCurrentLocation); } @Override public void onConnectionSuspended(int cause) {
Here is the code where I run the service:
import android.app.ActivityManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private Toolbar toolbar; private TabLayout tabLayout; public static ViewPager viewPager; public static ViewPagerAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); String currentUser = sharedPrefs.getString("Username", null); if (currentUser == null) {
Application start:
import android.app.Application; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.util.Log; import com.digits.sdk.android.Digits; import com.twitter.sdk.android.core.TwitterAuthConfig; import com.twitter.sdk.android.core.TwitterCore; import io.fabric.sdk.android.Fabric; public class ApplicationStart extends Application { private static Context mContext; @Override public void onCreate() { super.onCreate(); mContext = this.getApplicationContext(); SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); String currentUser = sharedPrefs.getString("Username", null); if (currentUser == null) {
Full manifest:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.package"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.READ_PROFILE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="com.android.alarm.permission.SET_ALARM" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" android:protectionLevel="signature" /> <application android:name=".ApplicationStart" android:allowBackup="false" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".LoginActivity" android:label="@string/title_activity_login" android:parentActivityName=".MainActivity" /> <activity android:name=".ContactsSettingsActivity" android:label="Contact Settings" android:launchMode="singleTop"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.package.ContactsChalkboard" /> </activity> <activity android:name=".MyIntro" /> <activity android:name=".ContactsChalkboard" /> <activity android:name=".AlarmActivity" /> <activity android:name=".AddContactActivity" android:parentActivityName=".MainActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.package.MainActivity" /> </activity> <activity android:name=".PictureNameActivity" android:label="@string/title_activity_picture_name" android:parentActivityName=".LoginActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.package.LoginActivity" /> </activity> <activity android:name=".Test" /> <activity android:name=".SettingsActivity" android:label="Settings"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.package.MainActivity" /> </activity> <activity android:name="com.package.GeofenceActivity" android:label="@string/title_activity_geofence"> </activity> <service android:name=".LocationBatteryService" android:enabled="true" android:exported="true" /> <service android:name=".MyFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> <service android:name=".MyFirebaseInstanceIDService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> </intent-filter> </service> <service android:name=".GeofenceTransitionsIntentService" /> <receiver android:name=".AlarmReceiver" android:enabled="true" android:exported="true" /> <receiver android:name=".BootReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> <meta-data android:name="com.google.android.geo.API_KEY" android:value="API KEY VALUE" /> <meta-data android:name="io.fabric.ApiKey" android:value="API KEY VALUE" /> </application> </manifest>
source share