0

My service don't start on system boot, only when the user press the refresh button. I've tried everythng searched in stack but nothing i've rewrited my code 4 times and nothing, i want my service run in a time interval and when the refresh button is pressed, i can´t understand why is not running on boot, Have i missed something?

Manifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.moody"
android:installLocation="internalOnly"
android:versionCode="0"
android:versionName="0.6.7.2 alpha" >

<permission
    android:name="com.android.moody.permission.GET_SERVER_DATA"
    android:protectionLevel="normal" />

<uses-sdk
    android:maxSdkVersion="18"
    android:minSdkVersion="14"
    android:targetSdkVersion="17" />

<uses-permission android:name="com.android.moody.permission.GET_SERVER_DATA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<application
    android:allowBackup="true"
    android:allowClearUserData="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="activities.MainActivity"
        android:label="@string/app_name" >
    </activity>
    <activity
        android:name="activities.Menu_esq"
        android:label="@string/title_activity_menu_esq" >
    </activity>
    <activity
        android:name="activities.BaseActivity"
        android:label="@string/title_activity_base" >
    </activity>
    <activity
        android:name="activities.MainView"
        android:label="@string/title_activity_main_view" >
    </activity>
    <activity
        android:name="activities.LoginActivity"
        android:label="@string/app_name"
        android:noHistory="true"
        android:windowSoftInputMode="adjustResize|stateVisible" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.example.moody.LeftActivity"
        android:label="@string/title_activity_left" >
    </activity>
    <activity
        android:name="com.example.moody.RightActivity"
        android:label="@string/title_activity_right" >
    </activity>
    <activity
        android:name="activities.UserDetailsActivity"
        android:label="@string/title_activity_user_details" >
    </activity>
    <activity
        android:name="fragments.FragTopicsPreview"
        android:label="@string/title_activity_copy_of_topics_preview" >
    </activity>
    <activity android:name="activities.LoadingActivity" >
    </activity>

    <service
        android:name="service.ServiceBackground"
        android:enabled="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/moody_service" >
    </service>

    <receiver android:name="service.Alarm" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    <receiver
        android:name="service.StartServiceReceiver"
        android:permission="com.android.moody.permission.GET_SERVER_DATA" >
        <intent-filter>
            <action android:name="moody_get_data" />
        </intent-filter>
    </receiver>
</application>

ServiceBackground

public class ServiceBackground extends Service {
Alarm alarm = new Alarm();

public ServiceBackground() {
    // TODO Auto-generated constructor stub
}

private boolean isRunning = false;
Object getContent;

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub

    return null;
}

@Override
public void onCreate() {
    super.onCreate();
    // android.os.Debug.waitForDebugger();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);
    // Starts the alarm
    alarm.setAlarm(getApplicationContext());

    // Announcement about starting
    Log.d("service", "Service Started");

    // Start a Background thread
    isRunning = true;
    Thread backgroundThread = new Thread(new BackgroundThread());
    backgroundThread.start();

    return START_NOT_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();

    // Stop the Background thread
    isRunning = false;

}

private class BackgroundThread implements Runnable {

    public void run() {
        try {
            while (isRunning) {
                Log.d("service", "Thread started");
                new ManContents().getAll(getResources(),
                        getApplicationContext());
                isRunning = false;
            }
            stopSelf();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Alarm

public class Alarm extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    context.startService(new Intent(context, ServiceBackground.class));
}

public void setAlarm(Context context) {
    String alarm = Context.ALARM_SERVICE;
    AlarmManager am = (AlarmManager) context.getSystemService(alarm);

    Intent intent = new Intent("moody_get_data");
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);

    int type = AlarmManager.ELAPSED_REALTIME_WAKEUP;
    // long interval = AlarmManager.INTERVAL_FIFTEEN_MINUTES;
    long interval = 1000 * 60 * 2;
    long triggerTime = SystemClock.elapsedRealtime() + interval;

    am.setRepeating(type, triggerTime, interval, pi);

}

public void CancelAlarm(Context context) {
    Intent intent = new Intent(context, Alarm.class);
    PendingIntent sender = PendingIntent
            .getBroadcast(context, 0, intent, 0);
    AlarmManager alarmManager = (AlarmManager) context
            .getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(sender);
}

}

StartServiceReceiver

public class StartServiceReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    Log.d("service", "Starting service from serviceReceiver");

    Intent service = new Intent(context, ServiceBackground.class);
    context.startService(service);
}

}

NOTES:

  • i already tried starting the service directly without filters, but for no reason don't start, so with filters was the only way that worked.
  • I also tried without the StartServiceReceiver.java, with the intent inside the alarm but no luck, i can change the code again if somebody thinks that its the problem.
  • I've the while(isRunning) in the thread only for future purpose, but i think the problem it's not because this.
firetrap
  • 1,947
  • 3
  • 24
  • 39
  • Are you using a Htc device? If so, check this: http://stackoverflow.com/questions/9525907/htcs-fast-boot-is-not-broadcasting-boot-completed-intent-nor-wiping-intents-f/18467723#18467723 – Lovis Oct 03 '13 at 10:42
  • nop, i'am using genyMotion emulator and nexus 4 – firetrap Oct 03 '13 at 11:23

1 Answers1

3

Compared with one of my implementations, there're small differences in the manifest:

  • used permissions (seems to be equal with yours

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

  • The Receiver

    <receiver
        android:name="com.<!your activity!>"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    

Yoiu see that there's an additional entry about the permission.

jboi
  • 11,324
  • 4
  • 36
  • 43