0

アプリケーションが常に onReceive メソッドに入るという問題があり、その理由がわかりません。ログ ステートメントをいくつか入力しましたが、onReceive が呼び出される理由がわかりません。BroadcastReceiverとAlarmManagerの使用例を見つけようとして、周りを見回していくつかの調査を行い、このサンプルプロジェクトに従いましたが、ブロードキャストを受信できないユーザーに関する他の多くの投稿を見つけましたが、ユーザーが受信しすぎていることについては見つかりませんでした.

これが私のコードの一部です:

AlarmClock.java:

public class AlarmClock extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
        wl.acquire();

        Log.d("TAG", "Signal Recieved");
        SetAlarm(context);

        wl.release();
    }

    public void SetAlarm(Context context){
        AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(context, AlarmService.class);
        PendingIntent pi = PendingIntent.getService(context, 0, i, 0);
        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 32000, pi);

        Log.d("TAG", "Alarm Set");
    }
}

AlarmService.java:

public class AlarmService extends IntentService {

    public AlarmService(){
        super("AlarmService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Log.d("TAG", "onHandleIntent");
        //operation to be completed
    }
}

AndroidManifest.XML:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.allen.repeatdialer" >

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    ...

    <receiver android:name=".AlarmClock">
        <intent-filter>
            <action android:name="com.example.allen.repeatdials.CALL_PLACED"/>
        </intent-filter>
    </receiver>
    <service android:name=".AlarmService"></service>

</application>

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

</manifest>

アプリケーションは Log.d("TAG", "onHandleIntent"); のみを表示します。sendBroadcast() を呼び出すと、他のログ ステートメントが 32 秒ごとに表示されます。しかし、sendBroadcast() を 1 回呼び出した後、Log.d("TAG", "onHandleIntent"); また、32 秒ごとに表示されます。

編集 (sendBroadcast() を呼び出すコード):

public class HomeScreen extends Activity implements OnClickListener {

//*******************************************************
//*                     On Create                       *
//*******************************************************
@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home_screen);
}

...

@Override
public void onClick(View arg0){
    switch (arg0.getId()){

        case R.id.bContact:
           displayContacts(Names, IDs);
           Log.d("TAG", "Contacts Pressed");
           break;

        case R.id.bStartDial:
            Log.d("TAG", "Dial Pressed");
            startDial();
            break;

        default:
            break;

    }
}


/* This method is responsible for placing the phone call.   */
public void startDial(){

    //performs call
    if (!phoneNumber.equals("")) {
        Uri number = Uri.parse("tel:" + phoneNumber);
        Intent dial = new Intent(Intent.ACTION_CALL, number);

        Intent intent = new Intent(this, AlarmClock.class);
        intent.setAction("com.example.allen.repeatdialer.CALL_PLACED");
        sendBroadcast(intent);

        startTime = System.currentTimeMillis();
        startActivityForResult(dial, DIAL_COMMENCED);
    }
}   
}

このアプリに関する背景情報を追加するために、ハンドラーを使用して正常に動作するようにしましたが、CPU がスリープ状態になるとハンドラーが機能しないため、AlarmManager を使用するようにアプリケーションを変更しようとはしていません。したがって、私の問題はブロードキャストの送信と受信にあることを知っています。

4

0 に答える 0