我想每天重复一次行动;即使应用程序未运行或设备已重新启动(重新启动),它也必须继续工作。在我的代码中,我试图每1分钟显示一条TOAST消息(作为测试);它在模拟器中运行良好,但在真实设备上它不起作用(我尝试做一些修改,因为我在一些答案中看到但仍然是相同的事情)
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()
}
}
主要信息
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 / - 此代码不适用于REAL DEVICE。
2 / - 如果用户重新启动设备,则此代码不起作用。
关于GitHub的一个样本(我已经做了一些改变,正如我朋友的建议,但仍然是相同的错误)
1 / - 此代码不适用于REAL DEVICE。
我已经下载了你的项目,在我的设备上运行它可以工作,当我点击开始时它会显示Toast
,每一分钟都会显示。
我建议你看看这个question
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
希望能帮助到你。