首页 > 解决方案 > 如何在 Android 上创建通过数组的通知?

问题描述

我是编程初学者!我正在尝试创建一个将在特定时间发送通知的应用程序。通知的描述必须来自先前在应用程序中定义的数组。现在,我正在分部分进行:通知由 WorkManager 创建,由按钮激活。目前它是一个 OneTimeWorkRequest。

我现在的问题是:如何获取通知以从数组中获取其描述?我尝试使用 while 循环,但它只使用数组中的第一个字符串。

我的活动代码:

class CatPicsActivity : AppCompatActivity() {

lateinit var notifBtn: MaterialButton;
lateinit var catBtn: ImageButton;
lateinit var title: String;
lateinit var catImg: ImageView;
var url: String = "https://api.thecatapi.com/v1/"

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

    notifBtn = findViewById(R.id.botaoNotificacao);
    catBtn = findViewById(R.id.catbtn);
    catImg = findViewById(R.id.imgCat);

    title = getResources().getString(R.string.titulo_notificacao);

    notifBtn.setOnClickListener {


        Log.i("WorkButton", "clicado")

        val notifcWorker: OneTimeWorkRequest =
                OneTimeWorkRequestBuilder<NotificationWorker>()
                        .build()

        WorkManager.getInstance(this)
                .enqueueUniqueWork(
                        "notification_worker",
                        ExistingWorkPolicy.KEEP,
                        notifcWorker
                )
    }

    catBtn.setOnClickListener {
        catFunction();
    }
}

private fun catFunction() {
    val retrofit = Retrofit.Builder()
            .baseUrl(url)
            .addConverterFactory(GsonConverterFactory.create())
            .build()

    val catService: CatService = retrofit.create(CatService::class.java)
    catService.randomCat().enqueue(object : Callback<List<Cat>> {
        override fun onResponse(call: Call<List<Cat>>, response: Response<List<Cat>>) {
            val randomCat = response.body()!!

            Picasso.get()
                    .load(randomCat[0].url)
                    .into(catImg)
        }

        override fun onFailure(call: Call<List<Cat>>, t: Throwable) {
            Toast.makeText(this@CatPicsActivity, "Deu errado! Tente novamente, por favor", Toast.LENGTH_SHORT).show()
            Log.i("CatPics", "Erro: $t")
        }
    })

}}

我的工人阶级:

class NotificationWorker(private val context: Context, params: WorkerParameters) : Worker(context, params) {


lateinit var descricao: String

fun generateDescription (): String {
    var razoes = arrayOf(
            "Esta é uma notificação de teste, por favor me avise no Telegram se chegou",
            "1 - ",
            "2 - ",
            "3 - ",
            "4 - ",
            "5 - ",
            "6 - ",
            "7 - ",
            "8 - ",
            "9 - ",
            "10 - ",
            "11 - ",
            "12 - ",
            "13 - ",
            "14 - ",
            "15 - ",
            "16 - ",
            "17 - ",
            "18 - ",
            "19 - ",
            "20 - ",
            "21 - ",
            "22 - ",
            "23 - ",
            "24 - ",
            "25 - ",
            "26 - ",
            "27 - ",
            "28 - ",
            "29 - ",
            "30 - ")

    var array = razoes
    var i = 0

    while(i < array.size){
        descricao = array[i]
        i += 1
        return descricao
    }

    return descricao
}

var title: String = "Você recebeu uma nova mensagem!"

override fun doWork(): Result {

    generateDescription()
    Log.i("WorkerDescricao2", descricao)
    Log.i("WorkBeforeNotification", "Trabalho criado")

    NotificationUtils.createNotification(context, title, descricao)

    Log.i("WorkAfterNotification", "notificação enviada")

    return Result.success()

}}

那么,如何从数组“razoes”中获取“descricao”变量?

谢谢!

编辑:

我希望数组中的每个值都用于不同的通知,该通知将在单击按钮后(或将来的每一天)发送。

标签: androidarrayskotlinnotifications

解决方案


在您的代码中,您在 while 循环中有一个返回。因此,在第一次迭代中,您将退出 while 循环并在descricao变量中返回razoes[0]. 也不需要使用额外的数组,您可以立即访问 razo:

 var i = 0
    while(i < razoes.size) {
        descricao = razoes[i]
        i += 1
        //return descricao
    }

所以我不知道你想保持什么价值。如果你想要所有的剃须刀,那么你应该NotificationUtils.createNotification(context, title, descricao) 循环调用。如果你想从 razoes 中获得特定的价值,你应该改变你的generateDescription乐趣,比如

fun generateDescription(position: Int): String {
    var razoes = arrayOf(
            "Esta é uma notificação de teste, por favor me avise no Telegram se chegou",
            "1 - ",
            "2 - ",
            "3 - ",
            "4 - ",
            "5 - ",
            "6 - ",
            "7 - ",
            "8 - ",
            "9 - ",
            "10 - ",
            "11 - ",
            "12 - ",
            "13 - ",
            "14 - ",
            "15 - ",
            "16 - ",
            "17 - ",
            "18 - ",
            "19 - ",
            "20 - ",
            "21 - ",
            "22 - ",
            "23 - ",
            "24 - ",
            "25 - ",
            "26 - ",
            "27 - ",
            "28 - ",
            "29 - ",
            "30 - ")
    descricao = razoes[position]
    return descricao
}

如果我理解正确,您希望单击按钮以在每次下一个剃须刀阵列项目时发送带有描述的通知。所以这里是一个处理点击按钮的例子(我敬酒一个虚拟消息,只是为了展示逻辑):

private var razoes = intArrayOf(1, 2, 3, 4, 5)
private var position: Int = -1

 binding.button.setOnClickListener {
            handleButtonClick()
        }

 private fun handleButtonClick() {
        position += 1
        if (position > razoes.size -1) {
            Toast.makeText(this@DemoActivity, "There are no other items in razoes", Toast.LENGTH_SHORT).show()
        } else {
            Toast.makeText(this@DemoActivity, razoes[position].toString(), Toast.LENGTH_SHORT).show()
        }
    }

推荐阅读