2

電話の起動時に呼び出される次のブロードキャスト レシーバーがあり ( Bootreciever.java)、繰り返しアラームを使用して断続的に実行されるサービスを開始しようとしています。

public void onReceive(Context context, Intent intent) {

    Toast.makeText(context,"Inside onRecieve() :D" , Toast.LENGTH_LONG).show();
    Log.d(getClass().getName(), "Inside onRecieve() :D");


    AlarmManager am = (AlarmManager) context
            .getSystemService(Context.ALARM_SERVICE);


    Intent i = new Intent(context, MyService.class);

    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);

    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
            SystemClock.elapsedRealtime() + 3000, 1000, pi);

}

基本的に、私は繰り返しアラームを設定して、3 秒間トリガーし、その後は 1 秒ごとにトリガーします。起動完了ブロードキャストは正常に受信されますが、サービスは開始されません。MyService.java次のようになります。

public class MyService extends Service {

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Toast.makeText(this, "Hello from MyService!", Toast.LENGTH_LONG);

        Log.d(getClass().getName(), "Hello from MyService!");

        stopSelf();

        return super.onStartCommand(intent, flags, startId);
    }

サービスを開始するときに何が間違っていますか?

Logcat は何も教えてくれません。サービスはマニフェストで定義されています。このサービス自体は、 using を使用して呼び出すとstartService()機能しますが、 内で使用すると失敗するようですPendingIntent

4

2 に答える 2

6

PendingIntent.getBroadcast()使用する代わりにPendingIntent.getService()

于 2012-05-30T03:46:31.453 に答える
1

アンドロイドは頻繁にトリガーされるアラームで少しうるさいので、あなたはあなたの期間をチェックするべきだと思います。サービスを開始するための最良の方法は、インテントを放送受信機にブロードキャストするようにアラームを設定し、それを取得してサービスを開始することです。

例1受信者:

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

public class QoutesReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // log instruction
        Log.d("SomeService", "Receiving Broadcast, starting service");
        // start the qoute service

        Intent newService = new Intent(context, SomeService.class);
        context.startService(newService);
    }

}

例2アラームを設定する関数(この例は2分ごとに実行されます):

public void setAlarm(Context context) {


        // Get the current time
        Calendar currTime = Calendar.getInstance();

        // Get the intent (start the receiver) 
        Intent startReceiver = new Intent(context, MyReceiver.class);

        PendingIntent pendReceiver = PendingIntent.getBroadcast(context, 0,
                startReceiver, PendingIntent.FLAG_CANCEL_CURRENT);

        // call the Alarm service
        AlarmManager alarms = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);
        //Setup the alarm

        alarms.setRepeating(AlarmManager.RTC_WAKEUP,
                currTime.getTimeInMillis() + (2 * 60 * 1000), 2 * 60 * 1000,
                pendReceiver);
    }
于 2012-05-30T03:57:01.800 に答える