首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在启动通知时会调用onDestroy()?如何预防呢?

在启动通知时调用onDestroy()是因为通知栏的通知被用户点击后,通知栏会自动关闭,并且会触发通知栏的点击事件,通常会启动一个新的Activity或者打开一个特定的界面。而在Android中,当一个新的Activity启动时,会先销毁当前的Activity,即调用当前Activity的onDestroy()方法。

为了预防在启动通知时调用onDestroy(),可以采取以下措施:

  1. 使用PendingIntent.FLAG_UPDATE_CURRENT标志:在创建通知栏的PendingIntent时,使用PendingIntent.FLAG_UPDATE_CURRENT标志,这样每次点击通知栏时都会更新PendingIntent,而不是创建新的PendingIntent。这样可以避免启动新的Activity,从而不会调用onDestroy()。
  2. 使用BroadcastReceiver处理通知栏点击事件:可以创建一个BroadcastReceiver来处理通知栏的点击事件,而不是直接启动一个新的Activity。在BroadcastReceiver中可以根据需要执行相应的操作,例如更新UI、发送广播等。
  3. 使用Service处理通知栏点击事件:可以创建一个Service来处理通知栏的点击事件,通过Service可以执行一些后台操作,而不会直接影响当前的Activity的生命周期。

需要注意的是,以上措施只是为了避免在启动通知时调用onDestroy(),具体的实现方式还需要根据具体的业务需求和场景来确定。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

笔记13 - Android中的内存泄漏如何优化

Activity内存泄漏的预防 Activity承载了应用和用户交互的任务,在Activity中有大量的资源引用和上下文Context这样占用内存较大的资源对象,因为Activity一旦因为外部变量的持有...LeakCanary源码分析 从上面的分析可以知道利用WeakReference和ReferenceQueue可以实现内存泄漏的监控,但是如何知道一个Activity应该被回收了呢,一般情况下,当一个Activity...的onDestroy被调用的时候,我们就认为一个Activity处于无用状态可以被回收了,因此我们需要监听每个Activity的onDestroy的调用情况。...可以看到LeakCanary对Activity的onDestroy进行了监听,在Activity调用了onDestroy的时候,将这个Activity通知到RefWatcher中。...我们知道Activity在启动之后会通过Looper.loop()阻塞的读取消息,当Looper的MessageQueue中没有消息的时候,线程会处于阻塞休眠的状态,我们如何知道主线程的Looper中没有消息可处理了呢

1.4K10

Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解

如,Activity的生命周期,activity的启动方式,还有如果两个activity的数据交互,就是页面和页面之间的数据交互,如,你在另一个界面上输入的数据,保存到另一个页面上,进行显示效果;activity...(){ super.onDestroy(); } 如果点击back,就是手机上有个返回键,回退,那么会启动那些方法呢,答,会启动 onPause()->onStop()->onDestroy()方法。...() 在这里你会注意到 onPause() 这个方法,当跳转到别的界面的时候,会先调用onPause()的方法,MainActivity跳转到SecondActivity时会先调用 MainActivity...问:如果在这里你会问 onRestart()的这个方法,你这个靠英语理解一下就可知道的,重新启动,那么会问为什么不onCreate()的方法,因为MainActivity()的这个已经创建了,所以就不用而用...Activity的启动方式 一种是直接,一种是匿名。不同的启动方式有什么不同的效果呢。

68230
  • Android Service完全解析,关于服务你所需知道的一切(上)

    Service的基本用法 关于Service最基本的用法自然就是如何启动一个Service了,启动Service的方法和启动Activity很类似,都需要借助Intent来实现,下面我们就通过一个具体的例子来看一下...也就是说,当启动一个Service的时候,会调用该Service中的onCreate()和onStartCommand()方法。 那么如果我再点击一次Start Service按钮呢?...可以看到,这次只有onStartCommand()方法执行了,onCreate()方法并没有执行,为什么会这样呢?...然后如何我们想解除Activity和Service之间的关联怎么办呢?调用一下unbindService()方法就可以了,这也是Unbind Service按钮的点击事件里实现的逻辑。...当然会,但是我们可以在Service中再创建一个子线程,然后在这里去处理耗时逻辑就没问题了。 额,既然在Service里也要创建一个子线程,那为什么不直接在Activity里创建呢?

    90140

    Android Service完全解析,关于服务你所需知道的一切(上)

    Service的基本用法 关于Service最基本的用法自然就是如何启动一个Service了,启动Service的方法和启动Activity很类似,都需要借助Intent来实现,下面我们就通过一个具体的例子来看一下...也就是说,当启动一个Service的时候,会调用该Service中的onCreate()和onStartCommand()方法。 那么如果我再点击一次Start Service按钮呢?...可以看到,这次只有onStartCommand()方法执行了,onCreate()方法并没有执行,为什么会这样呢?...然后如何我们想解除Activity和Service之间的关联怎么办呢?调用一下unbindService()方法就可以了,这也是Unbind Service按钮的点击事件里实现的逻辑。...当然会,但是我们可以在Service中再创建一个子线程,然后在这里去处理耗时逻辑就没问题了。 额,既然在Service里也要创建一个子线程,那为什么不直接在Activity里创建呢?

    1.5K50

    引入Jetpack架构后,你的App会发生哪些变化?

    onDestroy(){ observers.forEach{ observer.onDestroy() } } } 在BaseActivity...) } 播放器实现ObserverLifecycle接口,并在每个时机调用相应方法。...1.1 中 生命周期同步设计就是一个标准的观察者模式,ObserverLifecycle可作为观察者,PlayerActivity作为被观察者,当被观察者(PlayerActivity)生命周期发生改变时会主动通知到观察者...LiveData + Lifecycle 实现 1 + 1 > 2 LiveData在Lifecycle的加持下可以实现只在可见状态接收通知,说的通俗一点Activity执行了onStop()后内部的LiveData...viewModelScope协程作用域,所以将耗时操作直接放在viewModelScope即刻 另外在界面销毁时会调用ViewModel的onClear方法,可以在该方法做一些释放资源的操作,进一步降低内存泄露的风险

    1K31

    引入Jetpack架构后,你的App会发生哪些变化?

    onDestroy(){ observers.forEach{ observer.onDestroy() } } } 在BaseActivity...) } 播放器实现ObserverLifecycle接口,并在每个时机调用相应方法。...1.1 中 生命周期同步设计就是一个标准的观察者模式,ObserverLifecycle可作为观察者,PlayerActivity作为被观察者,当被观察者(PlayerActivity)生命周期发生改变时会主动通知到观察者...2.3 LiveData + Lifecycle 实现 1 + 1 > 2 LiveData在Lifecycle的加持下可以实现只在可见状态接收通知,说的通俗一点Activity执行了onStop()后内部的...viewModelScope协程作用域,所以将耗时操作直接放在viewModelScope即刻 另外在界面销毁时会调用ViewModel的onClear方法,可以在该方法做一些释放资源的操作,进一步降低内存泄露的风险

    1.9K80

    引入Jetpack架构后,你的App会发生哪些变化?

    onDestroy(){ observers.forEach{ observer.onDestroy() } } } 在BaseActivity...) } 播放器实现ObserverLifecycle接口,并在每个时机调用相应方法。...1.1 中 生命周期同步设计就是一个标准的观察者模式,ObserverLifecycle可作为观察者,PlayerActivity作为被观察者,当被观察者(PlayerActivity)生命周期发生改变时会主动通知到观察者...2.3 LiveData + Lifecycle 实现 1 + 1 > 2 LiveData在Lifecycle的加持下可以实现只在可见状态接收通知,说的通俗一点Activity执行了onStop()后内部的...viewModelScope协程作用域,所以将耗时操作直接放在viewModelScope即刻 另外在界面销毁时会调用ViewModel的onClear方法,可以在该方法做一些释放资源的操作,进一步降低内存泄露的风险

    84300

    Android高频面试专题 - 基础篇(一)Activity

    可以从图中看出当Activity发生意外的情况的时候,这里的意外指的就是系统配置发生改变(在未配置android:configChanges的前提下),如横竖屏切换(切横屏时会执行一次,切竖屏时会执行两次...(1- 4) (2) 通过跨进程的binder调用,进入到ActivityManagerService中,其内部会处理Activity栈,通知Activity1 Pause,Activity1 执行Pause...的,那么c界面点back返回a界面,为什么 singleInstance模式是存在于另一个任务栈中的。...为什么不用HashMap呢 Bundle内部是由ArrayMap实现的,ArrayMap的内部实现是两个数组,一个int数组是存储对象数据对应下标,一个对象数组保存key和value,内部使用二分法对key...如何在Application中获取当前Activity实例 在Application类,通过实现Application.ActivityLifecycleCallbacks接口调用registerActivityLifecycleCallbacks

    2K31

    Android四大组件完全解析(二)---Service

    多次调用startService方法时会多次触发onStartCommand方法,但是一旦调用了stopService或者是stopSelf方法,service会被停止(不论调用了多少次startService...例如,闹钟–实现对数据的一个轮询,闹钟会在每过N分钟就会去开启一个service,当调用onStartCommand时会让alarm在N分钟后再次启动服务,以达到轮询的效果(即循环的开启服务)。...什么样的服务会让系统这么做呢?开启的服务或者是与客户端绑定的服务 但是在系统在低内存的情况下时,不得不去杀死一些服务。接下来按照由高到低的优先级的顺序来说明(系统优先保持其运行的优先级)。...PendingIntent to launch our activity if the user //selects this notification //当点击该通知时启动...service:RemoteMessengerServiceSample 跨进程调用和进程内调用区别就在于如何去绑定一个服务,以及如何获取到binder对象。

    1.3K81

    Android面试题(四大组件篇)

    是否位于前台,对用户是否可见的区别 Q:Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明呢?如果启动的是一个Dialog呢?...标记位优先级比在AndroidManifest中指定优先级高 Q:如何启动其他应用的Activity?...并且不管如何调用,onCreate始终只会调用一次,对应startService调用多少次,Service的onStart便会调用多少次。...这意味着,在某些情况下,只要onReceive()方法完成,手机就会休眠。如果您的警报接收器调用Context.startService(),那么在启动所请求的服务之前,手机可能会休眠。...如何去开启一个前台服务? 前台服务即对用户可见的服务,可以以通知的形式创建前台服务 Q:是否了解ActivityManagerService,谈谈它发挥什么作用?

    91420

    Android实现进程保活方案解析

    白色保活 用startForeground()启动前台服务,这是官方提供的后台保活方式,不足的就是通知栏会常驻一条通知,像360的状态栏。...super.onCreate(); Log.i(TAG, "DaemonService---->onCreate被调用,启动前台service"); //如果API大于18,需要弹出一个可见通知...service,共享同一个NotificationID,并且将他们同时置为前台状态,此时会出现两个前台服务,但通知管理器里只有一个关联的通知。...这时我们在其中一个服务中调用 stopForeground(true),这个服务前台状态会被取消,同时状态栏通知也被移除。另外一个服务并没有受到影响,还是前台服务状态,但是此时,状态栏通知已经没了!...在其onDestroy方法中对自己重新启动。

    9.3K30

    常见Android面试题及答案(详细整理)

    onStop(): Activity被停止并转为不可见阶段及后续的生命周期事件时调用。 onRestart(): Activity被重新启动时调用。该活动仍然在栈中,而不是启动新的Activity。...答: 1、不设置Activity的android: configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。...Android Service只继承了onCreate(), onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用onCreate(), onStart()这两个方法...Broadcast receiver可以通过多种方式通知用户: 启动activity、使用NotificationManager、开启背景灯、振动设备、播放声音等,最典型的是在状态栏显示一个图标,这样用户就可以点它打开看通知内容...在manifest和代码中如何注册和使用 broadcast receiver 。

    3K11

    已中招!Android 基础面试常常吊死在这几个问题上……

    面试官:什么是 Activity Context 呢?为什么要用? 应聘者:此上下文在 Activity 中可用。该上下文与 Activity 的生命周期相关。...面试官:我讲完你就回去等通知吧! BuildType 定义了 Gradle 在构建和打包 Android 应用时使用的属性。...OnStop():不再对用户可见时调用。 OnDestroy():Activity结束时调用! OnRestart():在Activity停止之后,再次开始之前调用!...在 Activity 生命周期中,无论是在应用程序启动时,还是在Activity 被销毁然后重新创建(例如在配置更改期间)时,都会调用一次 onCreate() 方法。...旋转屏幕时,由于屏幕旋转时会重新创建布局,将首先调用onCreate() 方法。接下来照常按顺序执行! 第三波 11、面试官:你是如何做到旋转屏幕时防止数据重新加载和重置的?

    2K20

    Android lifecycle 使用详解

    ---- 为什么要引进 lifecycle 举一下我们最常用的 MVP 例子,没引进 lifecycle 之前,我们需要在 Activity 或者 Fragment 销毁的时候,即 onDestroy...的时候手动调用 onDestroy 方法,这里会带来一些问题,每一次在 Activity 或者 Fragment 销毁的烧开后都要调用 presenter.destory() 方法,这样的代码枯燥,毫无意义...那如果是别的类的呢,比如 MediaCompoment,在 Activity 的时候,我们需要销毁一些资源,按照传统的方法,我们还是需要在 Activity onDestroy 的时候手动调用 onDestroy...MediaCompoment 在 Activity ondestroy 的时候,我们需要销毁一些资源,用传统的方法,我们需要在 Activity onDestroy 的时候手动调用 onDestroy...这样会存在一个问题,调用者必须知道比较清楚得知道 MediaCompoment 的设计,否则可能会忘记调用 onDestroy 的方法。

    1.4K50

    大话企业级android读书笔记(二)

    有三个嵌套的循环,你可以通过这七个方法监视: 活动的整个生命时间,从第一次调用onCreate()开始直到调用onDestroy()结束。...一个活动在onCreate()中做所有的“全局”状态的初始设置,在onDestroy()中释放所有保留的资源。...在这期间,频繁地在重用和暂停状态转换——例如,当设备进入睡眠状态或一个新的活动启动时调用onPause(),当一个活动返回或一个新的意图被传输时调用onResume()。...startService()和bindService()的区别:startService(),Service是通过接收Intent经历onCreate()和onStart(),当用户在发出意图使之销毁时会经历...onDestory(),而bindService()方式启动,在与Activity绑定的时候,会经历onCreate()和onBind()而当Activity被销毁的时候,Service会先调用onUnbind

    1K50

    精选Android中高级高频面试题:四大组件及Fragment原理

    如果B是透明主题的又或则是个DialogActivity呢 ?...何时会被调用?...|screenSize"时,机型测试通过,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法; 推荐文章:Android 横竖屏切换加载不同的布局 8、如何启动其他应用的...:服务启动时调用,此方法适合完成一些数据加载工作,比如会在此处创建一个线程用于下载数据或播放音乐; onBind():服务被绑定时调用; onUnBind():服务被解绑时调用; onDestroy()...如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,回调顺序为onUnbind()→onDestroy(); 推荐文章: Android Service两种启动方式详解

    2K00

    Android内存优化(六)LeakCanary使用详解

    接下来在Application加入如下代码。 ?...在注释1处得到RefWatcher,并调用它的watch方法,watch方法的参数就是要监控的对象。...当然,在这个例子中onDestroy方法是多余的,因为LeakCanary在调用install方法时会启动一个ActivityRefWatcher类,它用于自动监控Activity执行onDestroy...这里只是为了方便举例,如果想要监控Fragment,在Fragment中添加如上的onDestroy方法是有用的。 运行程序,这时会在界面生成一个名为Leaks的应用图标。...再稍等片刻,内存泄漏信息就会通过Notification展示出来,比如三星S8的通知栏如下所示。 ? Notification中提示了MainActivity发生了内存泄漏, 泄漏的内存为787B。

    2.7K100

    Activity详细解释(生命周期、以各种方式启动Activity、状态保存,等完全退出)

    调用该方法后通常会调用 onStart() 方法。 onRestart():在 activity 被停止后又一次启动时会调用该方法。其兴许会调用 onStart 方法。...其兴许会调用 onPause() 方法。 onPause():在系统准备開始恢复其他 activity 时会调用该方法。 这种方法中通经常使用来提交一些还没保存的更改到持久数据 中。...onDestroy():在 activity 被销毁前会调用该方法。 这是 activity 能接收到的最后一个调用。...Activity类 通过上面的方法能够启动新的Activity了,但假设我要从当前的Activity中传递数据到新的Activity呢?...程序调用了onDestroy方法。程序退出了,可是我们查看其进程,发现调用了onDestroy方法之后这个Activity还在执行。 甚至调用了finish()方法之后程序还能在进程中看到。

    1.1K20
    领券