Автозапуск сервиса в приложении для Android - PullRequest
0 голосов
/ 07 сентября 2011

Я пытаюсь разработать простое приложение (сервис), которое автоматически запускается при загрузке.При основной деятельности также создается новый сервис (я вижу это в списке диспетчера задач сервиса).Этот сервис также должен быть создан после перезагрузки моего телефона (Samsung Galaxy Ace с Android 2.3.4) без запуска приложения, но это не так - я не вижу его в списке диспетчера задач сервиса.Где может быть проблема?Вот мои коды:

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="cz.nafik.testService"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-sdk android:minSdkVersion="10" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".TestServiceActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".MyService"
                 android:icon="@drawable/ic_launcher"
                 android:label="ledNotifier"
                 android:enabled="true">
            <intent-filter>
                <action android:name="cz.nafik.testService.MyService" />
            </intent-filter>
        </service>
        <receiver android:name=".BootUpReceiver" 
                  android:enabled="true"
                  android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>     
    </application>
</manifest>

MyService.java

package cz.nafik.testService;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;

public class MyService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        Toast.makeText(this, "service bind", Toast.LENGTH_LONG).show();
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "service starting", Toast.LENGTH_LONG).show();
        return super.onStartCommand(intent,flags,startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "service destroyed", Toast.LENGTH_LONG).show();
    }

}

BootUpReceiver.java

package cz.nafik.testService;

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

public class BootUpReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        intent.setAction("cz.nafik.testService.MyService");
        context.startService(intent);

    }

}

TestServiceActivity.java

package cz.nafik.testService;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class TestServiceActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Intent serviceIntent = new Intent();
        serviceIntent.setAction("cz.nafik.testService.MyService");
        this.startService(serviceIntent);

    }
}

Ответы [ 4 ]

2 голосов
/ 07 сентября 2011

Вы перепутали получателя и разрешения в файле манифеста.

  • Вы должны удалить эту строку в начале файла:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    
  • И вы должны изменить свой приемник на эту более простую версию:

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

Таким образом, он должен работать, если только не существует другой проблемы, помимо описанной выше.

0 голосов
/ 07 сентября 2011

Я думаю, что проблема связана с намерением, которое вы используете для запуска службы:

    intent.setAction("cz.nafik.testService.MyService");
    context.startService(intent);

Это не запустит службу cz.nafik.testService.MyService, а скорее вызовет действие "cz.nafix ...«о предыдущих получателях намерения.Вы, вероятно, хотите явно указать класс службы в качестве получателя нового намерения и сделать действие, специфичное для этой службы.

Вместо того, чтобы пытаться повторно использовать намерение, полученное вами как часть широковещательной передачи,новое намерение и использовать его вместо:

Intent startMyService = new Intent( context, MyService.class );
startMyService.setAction( "MAKE_TOAST" );
context.startService( startMyService );

Затем в службе вы можете проверить, какое действие выполнить:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if( "MAKE_TOAST".equals( intent.getAction() ) )
    {
        Toast.makeText(this, "service starting", Toast.LENGTH_LONG).show();
        return super.onStartCommand(intent,flags,startId);
    }
}
0 голосов
/ 07 сентября 2011

Попробуйте удалить:

android:permission="android.permission.RECEIVE_BOOT_COMPLETED"

и, возможно, также

<category android:name="android.intent.category.DEFAULT" />

из декларации манифеста для BootUpReceiver.

Я не нашел ни одного из этих необходимыхсделать то же самое в моем собственном приложении.

Кроме того, я не знаю, каковы последствия повторного использования намерения BOOT_COMPLETED в вашем коде BootupReceiver.Просто создайте новый, например:

public class BootUpReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent si = new Intent();
        si.setAction("cz.nafik.testService.MyService");
        context.startService(si);
    }

}
0 голосов
/ 07 сентября 2011

Я задавал почти тот же вопрос несколько дней назад. Вы можете найти его здесь: Приложение автозапуска Android

Просто следуйте примеру кода, чтобы он заработал. Вы перепутали несколько вещей с BroadcastReceiver и разрешениями.

...