当前位置: 首页 > 知识库问答 >
问题:

应用程序被终止后,无法使用WorkManager定期发送本地通知

单喜
2023-03-14

我正面临一个浪费时间的问题
我正在用本地SQLite数据库构建一个应用程序。例如,我希望此应用程序每隔15分钟向用户发送一次通知,其中包含来自SQLite数据库的一些数据。我已经成功地实现了这一点,只要应用程序正在运行或未被终止,但当应用程序被终止时,用户将不再看到通知。我正在两台真正的设备上测试这个应用程序

public Result doWork() {
    try {

      SqliteAssetHelper dbHelper = new SqliteAssetHelper(MainActivity.mcontext);
        mdatabase = dbHelper.getWritableDatabase();


        Cursor mCursor = mdatabase.query(BDH.BDHEntry.TABLE_NAME,
                new String[]{BDH.BDHEntry.COLUMN_HADITH_ID,BDH.BDHEntry.COLUMN_BOOK_NAME,
                        BDH.BDHEntry.COLUMN_DOOR_NAME, BDH.BDHEntry.COLUMN_NARRATORS, BDH.BDHEntry.COLUMN_CONTEXT},
                BDH.BDHEntry.COLUMN_BOOK_ID+"=?",new String[]{"1"},null,null, "RANDOM() LIMIT 1");

        if (mCursor != null) {
            mCursor.moveToFirst();
            if (mCursor.getCount() > 0) {
                while (mCursor.isAfterLast() == false) { //You need to check if cursor doesnot contain last row
                    hadithID = mCursor.getString(mCursor.getColumnIndex("HadithID"));
                    book = mCursor.getString(mCursor.getColumnIndex("BookName"));
                    door = mCursor.getString(mCursor.getColumnIndex("DoorName"));
                    mCursor.moveToNext();
                }
            }
        }

        Intent intentActivity = new Intent(MainActivity.mcontext, HadithActivity.class)
                .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        intentActivity.putExtra("id", hadithID );
        PendingIntent contentIntent = PendingIntent.getActivity(MainActivity.mcontext, 0, intentActivity, PendingIntent.FLAG_UPDATE_CURRENT);

        notificationManager = NotificationManagerCompat.from(MainActivity.mcontext);
        Notification notification = new NotificationCompat.Builder(MainActivity.mcontext,CHANNEL_ID)
                .setSmallIcon(R.drawable.book)
                .setContentTitle(book)
                .setContentText(door)
                .setPriority(NotificationCompat.PRIORITY_HIGH)
                .setAutoCancel(true)
                .setCategory(NotificationCompat.CATEGORY_CALL)
                .setContentIntent(contentIntent)
                .build();

        notificationManager.notify(notificationID, notification);
        return Result.success();

    }
    catch (Throwable throwable)
    {
        return Result.retry();
    }
}


在主要活动中,我使用上一个通知程序每15分钟显示一次:-

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mcontext = this;


    //creating constraints
    Constraints constraints = new Constraints.Builder()
            .setTriggerContentMaxDelay(1, TimeUnit.MINUTES)
            .build();


    PeriodicWorkRequest showHadithEveryHour = new PeriodicWorkRequest.Builder(HadithNotifier.class, 15, TimeUnit.MINUTES)
            .setConstraints(constraints)
            .build();
    WorkManager.getInstance(this).enqueue(showHadithEveryHour);
    }


当我更改通知程序类代码以显示不带任何值的日志消息时,logcat中的worker的结果是Success

Log.d(TAG,"Work Manager is working");

共有1个答案

汪泓
2023-03-14

至少,从这个类中删除所有对Main Activity.mcontext的引用。更好的做法是完全从应用程序中删除mbackground,因为这是内存泄漏。

您的Worker构造函数被传递一个Context。在字段中保留它,并使用doWork()方法中的Context

 类似资料:
  • 问题内容: 我正在iOS中制作一个应用程序,它将在计时器上发送本地通知。当应用程序处于后台状态时,它可以正常工作,但是在终止并完全关闭时,它无法工作。 无论如何,是否仍会在发生这种情况时发送本地通知? 提前致谢。 问题答案: 当然,如果您安排了本地通知,即使您终止应用程序,它也会触发。 …对我来说就像是一种魅力。

  • 我已经为这个问题挣扎了几天了 我有一个android应用程序,用户可以指定植物浇水的频率。我想根据植物浇水的频率发送通知。(例如,每3天发送一次通知) 我知道有很多问题可以解决这个问题,但我仍然无法让它发挥作用 我从使用报警管理器实现/启动服务开始 主要问题是,一旦我的应用程序被终止,通知将不再发送 我正在使用firebase存储所有数据 我读了一些关于firebase函数的内容,但我不知道这是否

  • 我在这方面发现了很多老问题,但我没有找到一个明确的答案,在应用程序被终止后,让本地通知单击事件起作用。如果应用程序处于活动状态或处于后台,则通知将起作用。为了进行测试,我编写了以下代码。 发生的情况是,通知已安排,并在2分钟后显示。如果应用程序在通知仍被触发的同时被终止,但单击事件未被处理,通知将再次安排。所以我假设通知在被点击后被清除,因为应用程序。ready事件稍后处理它无法处理click事件

  • 我需要每X分钟从服务器同步一次数据,即使在关闭应用程序之后也是如此。我使用WorkManger和PeriodicWorkRequest每X分钟触发一次。这是每X分钟触发一次,即使我们关闭了应用程序。退出应用程序后我面临的问题是如何访问静态类或变量? 示例代码: 同步类。反恐精英: 常数。反恐精英: 当应用程序处于前台和后台状态,但由于DependencyService类为null而在终止状态下失败

  • 我创建了一个简单的聊天应用程序,在接收者离线时向他发送推送通知。 正如我在标题中所说,当应用程序被终止时,我无法通过推送通知正确传递消息。实际上,当iPhone接收到推送通知并且应用程序被终止时,甚至application:didReceiveMemoteNotification:fetchCompletionHandler也不会被触发(如其他示例和apple文档中所示)。 然而,我的应用程序与W

  • 即使应用程序从后台被杀死或从内存中被刷出,我如何接收到设备的fcm通知。我使用维梧、Oppo、松下设备。但在应用程序被终止时未收到通知。