web-dev-qa-db-ja.com

BroadcastReceiverとAlarmManager Android

BroadcastReceiverでアラームマネージャーを使用しようとしています。 チュートリアル:システムサービスとBroadcastReceiver で与えられた例を使用しようとしています。しかし、時間の終了後に例を実行すると、トーストが表示されません。コードは以下のとおりです。

私の主な活動:

public class AlarmActivity extends Activity {


    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alarm);
    }

    public void startAlert(View view) {
        EditText text = (EditText) findViewById(R.id.time);
        int i = Integer.parseInt(text.getText().toString());
        Intent intent = new Intent(this, MyBroadcastReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 234324243, intent, 0);
        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()
                + (i * 1000), pendingIntent);
        Toast.makeText(this, "Alarm set in " + i + " seconds",
                Toast.LENGTH_LONG).show();
    }


}

私のbroadCastReceiver:

public class MyBroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Don't panic but your time is up!!!!.",
                Toast.LENGTH_LONG).show();
        // Vibrate the mobile phone
        Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
        vibrator.vibrate(2000);
    }

}

私のメインレイアウト:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
              Android:layout_width="match_parent"
              Android:layout_height="match_parent"
              Android:orientation="vertical" >

    <EditText
            Android:id="@+id/time"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:hint="Number of seconds"
            Android:inputType="numberDecimal" >
    </EditText>

    <Button
            Android:id="@+id/ok"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:onClick="startAlert"
            Android:text="Start Counter" >
    </Button>

</LinearLayout>

およびマニフェストファイル:

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

    <uses-sdk
        Android:minSdkVersion="8"
        Android:targetSdkVersion="18" />
    <uses-permission Android:name="Android.permission.VIBRATE" >
    </uses-permission>

    <application
        Android:allowBackup="true"
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme" >
        <activity
            Android:name="com.example.broadcastreceiver.AlarmActivity"
            Android:label="@string/app_name" >
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
         <receiver Android:name="com.example.Android_alarm.MyBroadcastReceiver" >
        </receiver>
    </application>

</manifest>
5
zied

受信者はBroadcastReceiverから拡張する必要があります

public class MyBroadcastReceiver extends BroadcastReceiver {
    // ...
}

また、マニフェストファイルのレシーバー名が正しいことを確認してください。

4
sudanix

myBroadcastReceiverクラスが間違っていますこのコードを入れてください

public class MyBroadcastReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent) {
     Toast.makeText(context, "Don't panik but your time is up!!!!.",
                Toast.LENGTH_LONG).show();
        // Vibrate the mobile phone
        /*Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
        vibrator.vibrate(2000);*/       
}
}

「extendsBroadcastReceiver」を追加して、onReceive()オーバーライドメソッドを取得する必要があります。

1
Rajan

OnReceive()メソッドをオーバーライドするのを忘れただけです。 public void onReceive(Context context, Intent intent)はBroadcastReceiverの事前定義されたメソッドであり、使用している場合でも、次のように@Overrideする必要があります。

public class MyBroadcastReceiver extends BroadcastReceiver
{
    @Override   // You forgot this line 
    public void onReceive(Context context, Intent intent) 
    {
          Toast.makeText(context, "Don't panik but your time is up!!!!.",Toast.LENGTH_LONG).show();
    }
}
0
user3243163

どこにも呼び出さなかったstartAlert関数を作成したので、最初にonCreateでそのメソッドを呼び出すと、トーストが届きます。

0
Malti Devnani