web-dev-qa-db-ja.com

アラームマネージャの例

自分のプロジェクトにスケジュール機能を実装したい。だから私はアラームマネージャプログラムを探したが、例が見つからなかった。

誰もが基本的な警報管理プログラムを手伝ってくれる?

315

これは実用的なコードです。電話機の電源が切れるまで、10分ごとにCPUを起動させます。

Manifest.xmlに追加します。

...
<uses-permission Android:name="Android.permission.WAKE_LOCK"></uses-permission>
...
<receiver Android:process=":remote" Android:name=".Alarm"></receiver>
...

あなたのクラスのコード:

package yourPackage;
import Android.app.AlarmManager;
import Android.app.PendingIntent;
import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
import Android.os.PowerManager;
import Android.widget.Toast;

public class Alarm 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();

        // Put here YOUR code.
        Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example

        wl.release();
    }

    public void setAlarm(Context context)
    {
        AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(context, Alarm.class);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 10, pi); // Millisec * Second * Minute
    }

    public void cancelAlarm(Context context)
    {
        Intent intent = new Intent(context, Alarm.class);
        PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(sender);
    }
}

サービスからアラームを設定:

package yourPackage;

import Android.app.Service;
import Android.content.Context;
import Android.content.Intent;
import Android.os.IBinder;

public class YourService extends Service
{
    Alarm alarm = new Alarm();
    public void onCreate()
    {
        super.onCreate();       
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) 
    {
        alarm.setAlarm(this);
        return START_STICKY;
    }

   @Override        
   public void onStart(Intent intent, int startId)
    {
        alarm.setAlarm(this);
    }

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

電話の起動時にアラームを繰り返すように設定したい場合:

Manifest.xmlに権限とサービスを追加します。

<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
...
<receiver Android:name=".AutoStart">
    <intent-filter>
        <action Android:name="Android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
</receiver>
...
<service
        Android:name=".YourService"
        Android:enabled="true"
        Android:process=":your_service" >
</service>

そして新しいクラスを作成します。

package yourPackage;

import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;

public class AutoStart extends BroadcastReceiver
{   
    Alarm alarm = new Alarm();
    @Override
    public void onReceive(Context context, Intent intent)
    {   
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))
        {
            alarm.setAlarm(context);
        }
    }
}
428
XXX

私はXXXから解決策を試してみましたが、最初はうまくいきましたが、ある時点でうまくいきませんでした。 onReceiveは二度と呼び出されませんでした。私はそれが何であるかを考え出すために何時間も費やしました。私が気づいたのは、どんな神秘的な理由のためのIntentがもはや呼ばれていなかったということです。これを回避するために、マニフェストのレシーバにアクションを指定する必要が本当にあることを私は発見しました。例:

<receiver Android:name=".Alarm" Android:exported="true">
    <intent-filter>
        <action Android:name="mypackage.START_ALARM" >
        </action>
    </intent-filter>
</receiver> 

名前はピリオド付きの".Alarm"です。 XXXのsetAlarmメソッドで、以下のようにIntentを作成します。

Intent i = new Intent("mypackage.START_ALARM");

START_ALARMメッセージは、あなたが望むものなら何でも構いません。私はただデモンストレーションの目的でその名前を付けました。

アクションを指定するインテントフィルタなしでマニフェストに定義された受信者を見たことがありません。 XXXが指定した方法でそれらを作成することは一種の偽物のようです。アクション名を指定することによって、Androidはそのアクションに対応するクラスを使用してBroadcastReceiverのインスタンスを作成することを強制されます。コンテキストに頼るのであれば、Androidにはすべてコンテキストと呼ばれるいくつかの異なるオブジェクトがあり、あなたのBroadcastReceiverが作成されることにならないかもしれないことに注意してください。アクションメッセージのみを使用してAndroidにクラスのインスタンスを作成させることは、絶対に機能しない可能性がある何らかの確実なコンテキストに頼るよりもはるかに優れています。

51
AndroidDev

これはかなり自己完結型の例です。 5秒後にボタンが赤くなります。

    public void SetAlarm()
    {
        final Button button = buttons[2]; // replace with a button from your own UI
        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override public void onReceive( Context context, Intent _ )
            {
                button.setBackgroundColor( Color.RED );
                context.unregisterReceiver( this ); // this == BroadcastReceiver, not Activity
            }
        };

        this.registerReceiver( receiver, new IntentFilter("com.blah.blah.somemessage") );

        PendingIntent pintent = PendingIntent.getBroadcast( this, 0, new Intent("com.blah.blah.somemessage"), 0 );
        AlarmManager manager = (AlarmManager)(this.getSystemService( Context.ALARM_SERVICE ));

        // set alarm to fire 5 sec (1000*5) from now (SystemClock.elapsedRealtime())
        manager.set( AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1000*5, pintent );
    }

ただし、AlarmManagerはアプリケーションが実行されていなくても起動することを忘れないでください。この関数を呼び出してホームボタンを押し、5秒間待ってからアプリに戻ると、ボタンが赤くなります。

アプリがメモリにまったくない場合にどのような動作になるのかわからないので、どのような状態を維持しようとしているかに注意してください。

25
amr

MainActivity.Java

package com.example.alarmexample;  

import Android.app.Activity;  
import Android.app.AlarmManager;  
import Android.app.PendingIntent;  
import Android.content.Intent;  
import Android.os.Bundle;  
import Android.view.View;  
import Android.view.View.OnClickListener;  
import Android.widget.Button;  
import Android.widget.EditText;  
import Android.widget.Toast;  

public class MainActivity extends Activity {  
Button b1;  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main); 

        startAlert();  

}   public void startAlert() { 
        int timeInSec = 2;

        Intent intent = new Intent(this, MyBroadcastReceiver.class);  
        PendingIntent pendingIntent = PendingIntent.getBroadcast(  
                                      this.getApplicationContext(), 234, intent, 0);  
        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);  
        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (timeInSec * 1000), pendingIntent);  
        Toast.makeText(this, "Alarm set to after " + i + " seconds",Toast.LENGTH_LONG).show();  
    }  

}

MyBroadcastReceiver.Java

package com.example.alarmexample;  

import Android.content.BroadcastReceiver;  
import Android.content.Context;  
import Android.content.Intent;  
import Android.media.MediaPlayer;  
import Android.widget.Toast;  

public class MyBroadcastReceiver extends BroadcastReceiver {  
    MediaPlayer mp;  
    @Override  
    public void onReceive(Context context, Intent intent) {  
        mp=MediaPlayer.create(context, R.raw.alarm);  
        mp.start();  
        Toast.makeText(context, "Alarm", Toast.LENGTH_LONG).show();  
    }  
}  

AndroidManifest.xml

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

    <uses-permission Android:name="Android.permission.VIBRATE" />  


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

        <activity  
            Android:name="com.example.alarmexample.MainActivity"  
            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="MyBroadcastReceiver" >  
        </receiver>  
    </application>  

</manifest>  
14
M.Usman

AlarmManagerIntentServiceの組み合わせ

AlarmManagerを使う最も良いパターンはIntentServiceとのコラボレーションだと思います。 IntentServiceAlarmManagerによってトリガーされ、受け取りインテントを通して必要なアクションを処理します。この構造体はBroadcastReceiverを使用するようなパフォーマンスへの影響はありません。私はこのアイデアのためのサンプルコードを kotlin で開発しました。

MyAlarmManager.kt

import Android.app.AlarmManager
import Android.app.PendingIntent
import Android.content.Context
import Android.content.Intent

object MyAlarmManager {

    private var pendingIntent: PendingIntent? = null

    fun setAlarm(context: Context, alarmTime: Long, message: String) {
        val alarmManager: AlarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager

        val intent = Intent(context, MyIntentService::class.Java)
        intent.action = MyIntentService.ACTION_SEND_TEST_MESSAGE
        intent.putExtra(MyIntentService.EXTRA_MESSAGE, message)

        pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
        alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime, pendingIntent)
    }

    fun cancelAlarm(context: Context) {
        pendingIntent?.let {
            val alarmManager: AlarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
            alarmManager.cancel(it)
        }
    }

}

MyIntentService.kt

import Android.app.IntentService
import Android.content.Intent

class MyIntentService : IntentService("MyIntentService") {

    override fun onHandleIntent(intent: Intent?) {
        intent?.apply {
            when (intent.action) {
                ACTION_SEND_TEST_MESSAGE -> {
                    val message = getStringExtra(EXTRA_MESSAGE)
                    println(message)
                }
            }
        }
    }

    companion object {
        const val ACTION_SEND_TEST_MESSAGE = "ACTION_SEND_TEST_MESSAGE"
        const val EXTRA_MESSAGE = "EXTRA_MESSAGE"
    }

}

manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.aminography.alarm">

    <application
        ... >

    <service
        Android:name="path.to.MyIntentService"
        Android:enabled="true"
        Android:stopWithTask="false" />

    </application>

</manifest>

使用法:

val calendar = Calendar.getInstance()
calendar.add(Calendar.SECOND, 10)
MyAlarmManager.setAlarm(applicationContext, calendar.timeInMillis, "Test Message!")

スケジュールされたアラームをキャンセルしたい場合は、これを試してください。

MyAlarmManager.cancelAlarm(applicationContext)
2
aminography

このコードは繰り返しアラームを鳴らすのに役立ちます。繰り返し時間はあなたが設定できます。

activity_main.xml

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

    <LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:gravity="center" >

    <EditText
        Android:id="@+id/ethr"
    Android:layout_width="50dp"
    Android:layout_height="wrap_content"
    Android:ems="10"
    Android:hint="Hr"
    Android:singleLine="true" >


        <requestFocus />
    </EditText>

    <EditText
        Android:id="@+id/etmin"
    Android:layout_width="55dp"
    Android:layout_height="wrap_content"

    Android:ems="10"
    Android:hint="Min"
    Android:singleLine="true" />

    <EditText
        Android:id="@+id/etsec"
    Android:layout_width="50dp"
    Android:layout_height="wrap_content"

    Android:ems="10"
    Android:hint="Sec"
    Android:singleLine="true" />

    </LinearLayout>

   <LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content" 
    Android:gravity="center"
    Android:paddingTop="10dp">


    <Button
        Android:id="@+id/setAlarm"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:onClick="onClickSetAlarm"
        Android:text="Set Alarm" />

</LinearLayout>

</LinearLayout>

MainActivity.Java

public class MainActivity extends Activity {
    int hr = 0;
    int min = 0;
    int sec = 0;
    int result = 1;

    AlarmManager alarmManager;
    PendingIntent pendingIntent;
    BroadcastReceiver mReceiver;

    EditText ethr;
    EditText etmin;
    EditText etsec;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ethr = (EditText) findViewById(R.id.ethr);
        etmin = (EditText) findViewById(R.id.etmin);
        etsec = (EditText) findViewById(R.id.etsec);
        RegisterAlarmBroadcast();
    } 

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    protected void onDestroy() {
        unregisterReceiver(mReceiver);
        super.onDestroy();
    }

    public void onClickSetAlarm(View v) {
        String shr = ethr.getText().toString();
        String smin = etmin.getText().toString();
        String ssec = etsec.getText().toString();

        if(shr.equals("")) 
            hr = 0;
        else {
            hr = Integer.parseInt(ethr.getText().toString());
            hr=hr*60*60*1000;
        }

        if(smin.equals(""))
            min = 0;
        else {
            min = Integer.parseInt(etmin.getText().toString());
            min = min*60*1000;
        }

        if(ssec.equals(""))
            sec = 0;
        else {
             sec = Integer.parseInt(etsec.getText().toString());
             sec = sec * 1000;
        }
        result = hr+min+sec;
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), result , pendingIntent); 
    }

    private void RegisterAlarmBroadcast() {
        mReceiver = new BroadcastReceiver() {
            // private static final String TAG = "Alarm Example Receiver";
            @Override
            public void onReceive(Context context, Intent intent) {
                Toast.makeText(context, "Alarm time has been reached", Toast.LENGTH_LONG).show();
            }
        };

        registerReceiver(mReceiver, new IntentFilter("sample"));
        pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent("sample"), 0);
        alarmManager = (AlarmManager)(this.getSystemService(Context.ALARM_SERVICE));
    }

    private void UnregisterAlarmBroadcast() {
        alarmManager.cancel(pendingIntent); 
        getBaseContext().unregisterReceiver(mReceiver);
    }
}

あなたが一度だけアラームが必要な場合は交換してください

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), result , pendingIntent);

 alarmManager.set( AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + result , pendingIntent );
2
Jose Kurian

私はこれを可能な限り簡単な方法で実行するように独自の実装を作成しました。

import Android.app.AlarmManager;
import Android.app.PendingIntent;
import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
import Android.content.IntentFilter;

import junit.framework.Assert;

/**
 * Created by Daniel on 28/08/2016.
 */
public abstract class AbstractSystemServiceTask {

    private final Context context;
    private final AlarmManager alarmManager;
    private final BroadcastReceiver broadcastReceiver;
    private final PendingIntent pendingIntent;

    public AbstractSystemServiceTask(final Context context, final String id, final long time, final AlarmType alarmType, final BackgroundTaskListener backgroundTaskListener) {

        Assert.assertNotNull("ApplicationContext can't be null", context);
        Assert.assertNotNull("ID can't be null", id);

        this.context = context;

        this.alarmManager = (AlarmManager) this.context.getSystemService(Context.ALARM_SERVICE);

        this.context.registerReceiver(
                this.broadcastReceiver = this.getBroadcastReceiver(backgroundTaskListener),
                new IntentFilter(id));

        this.configAlarmManager(
                this.pendingIntent = PendingIntent.getBroadcast(this.context, 0, new Intent(id), 0),
                time,
                alarmType);
    }

    public void stop() {

        this.alarmManager.cancel(this.pendingIntent);
        this.context.unregisterReceiver(this.broadcastReceiver);
    }

    private BroadcastReceiver getBroadcastReceiver(final BackgroundTaskListener backgroundTaskListener) {

        Assert.assertNotNull("BackgroundTaskListener can't be null.", backgroundTaskListener);

        return new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {

                backgroundTaskListener.perform(context, intent);
            }
        };
    }

    private void configAlarmManager(final PendingIntent pendingIntent, final long time, final AlarmType alarmType) {

        long ensurePositiveTime = Math.max(time, 0L);

        switch (alarmType) {
            case REPEAT:
                this.alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), ensurePositiveTime, pendingIntent);
                break;
            case ONE_TIME:
            default:
                this.alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + ensurePositiveTime, pendingIntent);
        }
    }

    public interface BackgroundTaskListener {

        void perform(Context context, Intent intent);

    }

    public enum AlarmType {

        REPEAT, ONE_TIME;

    }

}

次のステップはそれを実行することです。

import Android.content.Context;
import Android.content.Intent;
import Android.util.Log;

import ...AbstractSystemServiceTask;

import Java.util.concurrent.TimeUnit;

/**
 * Created by Daniel on 28/08/2016.
 */
public class UpdateInfoSystemServiceTask extends AbstractSystemServiceTask {

    private final static String ID = "UPDATE_INFO_SYSTEM_SERVICE";
    private final static long REPEAT_TIME = TimeUnit.SECONDS.toMillis(10);
    private final static AlarmType ALARM_TYPE = AlarmType.REPEAT;

    public UpdateInfoSystemServiceTask(Context context) {

        super(context, ID, REPEAT_TIME, ALARM_TYPE, new BackgroundTaskListener() {

            @Override
            public void perform(Context context, Intent intent) {

                Log.i("MyAppLog", "-----> UpdateInfoSystemServiceTask");

                //DO HERE WHATEVER YOU WANT...
            }
        });

        Log.i("MyAppLog", "UpdateInfoSystemServiceTask started.");
    }

}

私はこの実装で作業するのが好きです、しかしもう一つの可能​​な良い方法は、それはAbstractSystemServiceTaskクラスを抽象化しないで、そしてビルダーを通してそれを構築することです。

お役に立てば幸いです。

UPDATED同じBackgroundTaskListenerに複数のBroadCastReceiverを使えるようにしました。

import Android.app.AlarmManager;
import Android.app.PendingIntent;
import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
import Android.content.IntentFilter;

import junit.framework.Assert;

import Java.util.HashSet;
import Java.util.Set;

/**
 * Created by Daniel on 28/08/2016.
 */
public abstract class AbstractSystemServiceTask {

    private final Context context;
    private final AlarmManager alarmManager;
    private final BroadcastReceiver broadcastReceiver;
    private final PendingIntent pendingIntent;

    private final Set<BackgroundTaskListener> backgroundTaskListenerSet;

    public AbstractSystemServiceTask(final Context context, final String id, final long time, final AlarmType alarmType) {

        Assert.assertNotNull("ApplicationContext can't be null", context);
        Assert.assertNotNull("ID can't be null", id);

        this.backgroundTaskListenerSet = new HashSet<>();

        this.context = context;

        this.alarmManager = (AlarmManager) this.context.getSystemService(Context.ALARM_SERVICE);

        this.context.registerReceiver(
                this.broadcastReceiver = this.getBroadcastReceiver(),
                new IntentFilter(id));

        this.configAlarmManager(
                this.pendingIntent = PendingIntent.getBroadcast(this.context, 0, new Intent(id), 0),
                time,
                alarmType);
    }

    public synchronized void registerTask(final BackgroundTaskListener backgroundTaskListener) {

        Assert.assertNotNull("BackgroundTaskListener can't be null", backgroundTaskListener);

        this.backgroundTaskListenerSet.add(backgroundTaskListener);
    }

    public synchronized void removeTask(final BackgroundTaskListener backgroundTaskListener) {

        Assert.assertNotNull("BackgroundTaskListener can't be null", backgroundTaskListener);

        this.backgroundTaskListenerSet.remove(backgroundTaskListener);
    }

    public void stop() {

        this.backgroundTaskListenerSet.clear();

        this.alarmManager.cancel(this.pendingIntent);
        this.context.unregisterReceiver(this.broadcastReceiver);
    }

    private BroadcastReceiver getBroadcastReceiver() {

        return new BroadcastReceiver() {

            @Override
            public void onReceive(final Context context, final Intent intent) {

                for (BackgroundTaskListener backgroundTaskListener : AbstractSystemServiceTask.this.backgroundTaskListenerSet) {

                    backgroundTaskListener.perform(context, intent);
                }
            }
        };
    }

    private void configAlarmManager(final PendingIntent pendingIntent, final long time, final AlarmType alarmType) {

        long ensurePositiveTime = Math.max(time, 0L);

        switch (alarmType) {
            case REPEAT:
                this.alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), ensurePositiveTime, pendingIntent);
                break;
            case ONE_TIME:
            default:
                this.alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + ensurePositiveTime, pendingIntent);
        }
    }

    public interface BackgroundTaskListener {

        void perform(Context context, Intent intent);

    }

    public enum AlarmType {

        REPEAT, ONE_TIME;

    }

}
1
Dani

これは、Kotlinを使ったAlarm Managerの例です。

class MainActivity : AppCompatActivity() {

    val editText: EditText by bindView(R.id.edit_text)
    val timePicker: TimePicker by bindView(R.id.time_picker)
    val buttonSet: Button by bindView(R.id.button_set)
    val buttonCancel: Button by bindView(R.id.button_cancel)
    val relativeLayout: RelativeLayout by bindView(R.id.activity_main)
    var notificationId = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        timePicker.setIs24HourView(true)

        val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager

        buttonSet.setOnClickListener {
            if (editText.text.isBlank()) {
                Toast.makeText(applicationContext, "Title is Required!!", Toast.LENGTH_SHORT).show()
                return@setOnClickListener
            }
            alarmManager.set(
                AlarmManager.RTC_WAKEUP,
                Calendar.getInstance().apply {
                    set(Calendar.HOUR_OF_DAY, timePicker.hour)
                    set(Calendar.MINUTE, timePicker.minute)
                    set(Calendar.SECOND, 0)
                }.timeInMillis,
                PendingIntent.getBroadcast(
                    applicationContext,
                    0,
                    Intent(applicationContext, AlarmBroadcastReceiver::class.Java).apply {
                        putExtra("notificationId", ++notificationId)
                        putExtra("reminder", editText.text)
                    },
                    PendingIntent.FLAG_CANCEL_CURRENT
                )
            )
            Toast.makeText(applicationContext, "SET!! ${editText.text}", Toast.LENGTH_SHORT).show()
            reset()
        }

        buttonCancel.setOnClickListener {
            alarmManager.cancel(
                PendingIntent.getBroadcast(
                    applicationContext, 0, Intent(applicationContext, AlarmBroadcastReceiver::class.Java), 0))
            Toast.makeText(applicationContext, "CANCEL!!", Toast.LENGTH_SHORT).show()
        }
    }

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        (getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager)
            .hideSoftInputFromWindow(relativeLayout.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
        relativeLayout.requestFocus()
        return super.onTouchEvent(event)
    }

    override fun onResume() {
        super.onResume()
        reset()
    }

    private fun reset() {
        timePicker.apply {
            val now = Calendar.getInstance()
            hour = now.get(Calendar.HOUR_OF_DAY)
            minute = now.get(Calendar.MINUTE)
        }
        editText.setText("")
    }
}
0
ARGeo

アラームマネージャ:

XMLレイアウトに追加(*これらのビューをメインアクティビティで作成するときに初期化します)

  <TimePicker
    Android:id="@+id/timepicker"
    Android:layout_width="match_parent"
    Android:layout_height="0dp"
    Android:layout_weight="2"></TimePicker>

  <Button
    Android:id="@+id/btn_start"
    Android:text="start Alarm"
    Android:onClick="start_alarm_event"
    Android:layout_width="match_parent"
    Android:layout_height="52dp" />

マニフェストに追加(アプリケーションタグ内および外部アクティビティ)

 <receiver Android:name=".AlarmBroadcastManager"
        Android:enabled="true"
        Android:exported="true"/>

AlarmBroadcastManagerクラスを作成します(BroadcastReceiverから継承します)。

 public class AlarmBroadcastManager extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
      MediaPlayer mediaPlayer=MediaPlayer.create(context,Settings.System.DEFAULT_RINGTONE_URI);
      mediaPlayer.start();
    }
 }

主な活動(これらの機能を追加):

 @RequiresApi(api = Build.VERSION_CODES.M)
 public  void start_alarm_event(View view){
    Calendar calendar=Calendar.getInstance();
    calendar.set(
    calendar.get(Calendar.YEAR),
    calendar.get(Calendar.MONTH),
    calendar.get(Calendar.DAY_OF_MONTH),
    timePicker.getHour(),
    timePicker.getMinute(),
    0
    );
    setAlarm(calendar.getTimeInMillis());
 }

 public void setAlarm(long timeInMillis){
    AlarmManager alarmManager=(AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent=new Intent(this,AlarmBroadcastManager.class);
    PendingIntent pendingIntent=PendingIntent.getBroadcast(this,0,intent,0);
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,timeInMillis,AlarmManager.INTERVAL_DAY,pendingIntent);
    Toast.makeText(getApplicationContext(),"Alarm is Set",Toast.LENGTH_SHORT).show();


 }
0