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

为什么调用onDestroy()时服务不停止

经正祥
2023-03-14

我有一个ArrayList,它应该在包含0个以上对象时启动报警服务,在包含0个对象时停止报警服务。

public static void addPendingContact(Contact contact) {
    contactList.add(contact);
    if (1 == contactList.size()) { //Start the alarm only once. 
        Intent intent = new Intent(myContext, AlarmService.class);
        myContext.startService(intent);
    }       
}

public static void completePendingContact(Contact contact) {
    contactList.remove(contact);
    Toast.makeText(myContext, contactList.size() + "", Toast.LENGTH_LONG).show();
    if (0 == contactList.size()) {
        Intent intent = new Intent(myContext, AlarmService.class);
        myContext.stopService(intent);
        Toast.makeText(myContext, "Reminder removed", Toast.LENGTH_LONG).show();
    }
}

这是报警服务类。

public class AlarmService extends Service {

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Intent myIntent = new Intent(this, NotificationBarAlarm.class);
    myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    PendingIntent pIntent = PendingIntent.getBroadcast(
            getApplicationContext(), 0, myIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);

    SharedPreferences sp = PreferenceManager
            .getDefaultSharedPreferences(getApplicationContext());
    am.setInexactRepeating(AlarmManager.RTC_WAKEUP,
            sp.getLong("notifications_time", System.currentTimeMillis()),
            60 *1000, pIntent);

    Date dd = new Date(sp.getLong("notifications_time", System.currentTimeMillis()));
    DateFormat formatter = new SimpleDateFormat("HH:mm:ss:SSS");
    String dateFormatted = formatter.format(dd);

    Toast.makeText(getApplicationContext(), "My Service started, to ring at " + dateFormatted ,
            Toast.LENGTH_LONG).show();

    Log.d("Service Message", "The service should be created.");

    return START_STICKY;
}

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onDestroy() {
    super.onDestroy();
    Toast.makeText(getApplicationContext(), "My Service stopped",
            Toast.LENGTH_LONG).show();
    Log.d("Service Message", "The service should be stopped.");
}

这是on Receive方法广播接收器类

@Override
public void onReceive(Context context, Intent intent) {
    Toast.makeText(context, "Re", Toast.LENGTH_LONG).show();
    notifyManager = (NotificationManager) context
            .getSystemService(Context.NOTIFICATION_SERVICE);
    Intent notificationIntent = new Intent(context, MainActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
            notificationIntent, 0);
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
            context).setSmallIcon(android.R.drawable.ic_dialog_email)
            .setContentTitle("Review Pending Contacts")
            .setContentText("You have pending contacts to review.")
            .setContentIntent(contentIntent)
            .setAutoCancel(true);

    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
    mBuilder.setSound(Uri.parse(sp.getString("notifications_new_message_ringtone", null)));

    Log.d("Notification Service", "Notification Created");
    notifyManager.notify(1, mBuilder.build());

}

问题是,即使调用了报警服务的onDestroy方法,通知也不会停止。

我错过什么了吗?

谢谢

共有1个答案

张建华
2023-03-14

所以在我的onDestroy()中,我必须取消警报?

对<代码>报警管理器独立于您的服务。如果要停止触发服务的AlarmManager,则需要cancel()AlarmManager事件。

 类似资料:
  • 我可以安全地停止我的主活动的onDestroy方法中的服务吗?我知道onDestroy不能保证被调用,但我也想让我的服务运行,直到应用程序被销毁。 我在想,也许在所有活动被破坏的情况下,服务也会被破坏?

  • 我在活动的中放置了一些缓存清理代码,但大多数情况下,除非通过显式地完成活动,否则这些代码不会执行。 编辑:只读仅在或系统资源不足时调用。那么我需要把我的缓存清理代码放在哪里呢?如果我把它放在中,用户返回到应用程序,缓存就会被清除。我实际上是在缓存中存储重要的临时文件,这些文件不应该在中删除。

  • 第一个线程组-Wisebuy 1-1在2019-04-30 15:46:11,559开始 我将上升周期设置为1秒,为什么线程组-Wisebuy 1-5891在2019-04-30 15:46:15,541开始? 我将持续时间设置为2秒,为什么线程组-Wisebuy 1-7239在2019-04-30 15:46:18,767停止?

  • 问题内容: 我试图弄清楚为什么在他提供的示例中首先需要服务层。如果你将其取出,则可以在客户中执行以下操作: 似乎服务层只是DAO的包装。有人可以给我一个情况,如果服务层被删除,情况可能会变得一团糟?我只是看不到拥有服务层的意义。 问题答案: 让服务层成为DAO的包装是一种常见的反模式。在你提供的示例中,它肯定不是很有用。使用服务层意味着你将获得以下好处: 你需要在控制器中最好完成的Web类型活动和

  • 本文向大家介绍为什么要使用微服务?相关面试题,主要包含被问及为什么要使用微服务?时的应答技巧和注意事项,需要的朋友参考一下 随着互联网的快速发展,各行各业都在用互联网。互联网已经离不开人们的形形色色。随着越来越多的用户,业务场景也愈来愈复杂。 传统的单体架构已经很难满足互联网技术发展的要求,代码可维护性扩展性和可读性降低,维护成本的提高都是驱动微服务的发展趋势。

  • 问题内容: 我偶然发现了一个问题,可以总结如下: 当我手动创建线程(即通过实例化)时,将适当地调用它。但是,当我与一起使用时,处理程序将被忽略。我错过了什么? 我期望:消息“未捕获的异常…”的三倍 我得到:消息一次(由手动创建的线程触发)。 在Windows 7和Mac OS X 10.5上用Java 1.6复制。 问题答案: 因为异常不会被捕获。 您的ThreadFactory生成的线程没有直接