Как запустить сервис при загрузке в Android 2.3 (Gingerbread) без сбоев - PullRequest
4 голосов
/ 30 декабря 2011

Я выполнил несколько инструкций по запуску службы при загрузке.

В Android 2.2 все работает нормально.

Я заметил, что в Android 2.3 процесс падает, и ActivityManager планирует перезапуск службы снова и снова.

В моем сервисе я хочу doSomething() каждые 5 секунд!Для этого я использую TimerTask.

Вот MyService.java код:

package example.service;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {
    private static final String TAG = "MyService";  
    private static final int TIMER_SECONDS = 5;

    private Timer doSomethingTimer;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() { 
        super.onCreate();
        Log.d(TAG, TAG + ": My Service Created");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, TAG + ": My Service Destroyed");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        initDoSomethingTimer();             
        Log.d(TAG, TAG + ": My Service Started");
        return START_STICKY;    
    }

    private void initDoSomethingTimer() {
        doSomethingTimer = new Timer();
        doSomethingTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                doSomething();

            }
        }, 0, TIMER_SECONDS * 1000);
    }

    private void doSomething() {
        Log.d(TAG, TAG + ": did something!!");
    }

}

Вот MyStartupIntentReceiver.java код:

package example.service;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class MyStartupIntentReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent serviceIntent = new Intent(); 
        serviceIntent.setAction("example.service.MyService");
        context.startService(serviceIntent);
    }

}

и, наконец, мой файл AndroidManifest.xml :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:installLocation="internalOnly"
    package="example.service"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />

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

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <service android:name=".MyService" >
            <intent-filter>
                <action android:name="example.service.MyService" />
            </intent-filter>
        </service>

        <receiver android:name=".MyStartupIntentReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

Результат неизвестен :( После загрузки создается служба,но не запускается , а затем происходит сбой и расписание ActivityManager для его перезапуска - и запускает цикл! Вот что мы можем увидеть в Logcat :

I/ActivityManager(  187): Start proc example.service for service example.service/.MyService: pid=615 uid=10052 gids={}
D/MyService(  615): MyService: My Service Created
(...)
I/Process (  187): Sending signal. PID: 615 SIG: 9
W/ActivityManager(  187): Scheduling restart of crashed service example.service/.MyService in 59628ms
(...)
I/ActivityManager(  187): Start proc example.service for service example.service/.MyService: pid=639 uid=10052 gids={}
D/MyService(  639): MyService: My Service Created
(...)
I/Process (  187): Sending signal. PID: 639 SIG: 9
W/ActivityManager(  187): Scheduling restart of crashed service example.service/.MyService in 238512ms

Anyпредложения ?! Я застрял. Я заметил, что другие службы, кроме этой новой (без таймерной задачи), начали зависать в Android 2.3 , с такими же ошибками.

1 Ответ

0 голосов
/ 30 декабря 2011

Мне кажется, что проблема в том, что у вас недостаточно памяти, поэтому android убивает этот сервис и все время запускает его снова. У меня была эта проблема, когда я попробовал ICS в эмуляторе. Попробуйте увеличить объем ОЗУ для вашего AVD (параметр «Размер ОЗУ устройства» до 512 МБ) в AVD Manager. Напишите, пожалуйста, о результатах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...