Как повторять действие каждый день в приложении для Android? - PullRequest
2 голосов
/ 28 марта 2019

Я хочу повторять действие каждый день;он должен продолжать работать, даже если приложение не запущено или устройство было перезапущено (перезагружено).В моем коде я пытаюсь показать сообщение TOAST каждую 1 минуту (в качестве теста);в эмуляторе он работает нормально, но на реальном устройстве он не работает (я попытался внести некоторые изменения в исправленные, как я вижу в некоторых ответах, но все еще то же самое)

MyReceiver

class MyReceiver : BroadcastReceiver() {
    private val channelId = "com.medanis.hikamwahimam"

    override fun onReceive(context: Context, intent: Intent) {
        Log.i("TAG","/////////////////// SHOW NOTIFICATION NOW //////////////////////")
        val builder = NotificationCompat.Builder(context, channelId)
            .setSmallIcon(R.drawable.ic_stat_name)
            .setLargeIcon(BitmapFactory.decodeResource(context.resources,R.mipmap.ic_launcher_round))
            .setContentTitle("My notification")
            .setContentText("Much longer text that cannot fit one line...")
            .setStyle(
                NotificationCompat.BigTextStyle()
                    .bigText("Much longer text that cannot fit one line...Much longer text that cannot fit one line..."))
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        with(NotificationManagerCompat.from(context)) {
            notify(12345, builder.build()) }
        Toast.makeText(context,"This toast will be shown every X minutes", Toast.LENGTH_LONG).show()
    }
}

MainActivity

class MainActivity : AppCompatActivity() {
    private var mAlarmManager : AlarmManager? = null

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

        val mIntent = Intent(this, MyReceiver::class.java)

        val mPendingIntent = PendingIntent.getBroadcast(this, 0, mIntent, PendingIntent.FLAG_UPDATE_CURRENT)
        mAlarmManager = this
            .getSystemService(Context.ALARM_SERVICE) as AlarmManager
        mAlarmManager!!.setRepeating(
            AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),
            60000, mPendingIntent
        )
    }
}

AndroidManifest.xml

<receiver android:name=".MyReceiver" >
</receiver>

Проблемы:

1 / - Этот код не работает с РЕАЛЬНЫМ УСТРОЙСТВОМ.

2 / - Этот код не работает, если пользователь перезагружает свое устройство.

Образец на GitHub (я внес некоторые изменения, как предложил мой друг, но все те же ошибки)

1 Ответ

0 голосов
/ 28 марта 2019

1 / - Этот код не работает с РЕАЛЬНЫМ УСТРОЙСТВОМ.

Я скачал ваш проект, запустил на моем устройстве, и он работает, он показывает Toast, когда я нажимаю старт, и каждую минуту показывает.

Я рекомендую вам взглянуть на этот вопрос

2 / - Этот код не работает, если пользователь перезагружает свое устройство.

Если вы хотите перезагрузить BroadcastReceiver после перезагрузки или выключения устройства, вы можете добавить этот код:

Добавьте это в ваш manifest.xml

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

Создать еще один receiver в manifest.xml

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

А затем создайте BroadcastReceiver, как вы делали ранее для показа Toast

class BootCompletedIntentReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        if ("android.intent.action.BOOT_COMPLETED" == intent.action) {
          //Start your old broadcastreceiver
        }
    }
}

Для получения дополнительной информации вы можете посмотреть на это post

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...