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

如果应用程序未处于焦点状态,则Vibrator.vibrate()不会在Android10 Pie中执行任何操作

在Android 10 Pie(即Android 9.0)中,Vibrator.vibrate() 方法的行为确实有所变化,特别是当应用程序未处于焦点状态时。以下是关于这个问题的基础概念、原因、解决方案以及相关应用场景的详细解释:

基础概念

Vibrator服务:Android系统提供的一个服务,允许应用程序触发设备的振动功能。

焦点状态:指的是应用程序当前是否在前台运行并且用户与之交互。

原因

在Android 10 Pie及更高版本中,为了提升用户体验和电池效率,系统对后台应用的振动权限进行了限制。当应用程序不在前台时,系统默认不会执行振动操作,除非应用具有特定的权限或使用了特定的API。

解决方案

1. 请求振动权限

在应用的AndroidManifest.xml文件中声明振动权限:

代码语言:txt
复制
<uses-permission android:name="android.permission.VIBRATE"/>

2. 使用Foreground Service

如果应用需要在后台触发振动,可以考虑使用前台服务(Foreground Service)。前台服务在系统中具有更高的优先级,可以在后台执行一些操作。

创建一个前台服务并在其中触发振动:

代码语言:txt
复制
public class VibrationService extends Service {
    private Vibrator vibrator;

    @Override
    public void onCreate() {
        super.onCreate();
        vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 创建通知以保持服务在前台运行
        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("Vibration Service")
                .setContentText("Running")
                .setSmallIcon(R.drawable.ic_notification)
                .build();

        startForeground(1, notification);

        // 触发振动
        long[] pattern = {0, 1000, 500, 1000}; // 自定义振动模式
        vibrator.vibrate(pattern);

        return START_NOT_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

AndroidManifest.xml中声明服务:

代码语言:txt
复制
<service android:name=".VibrationService" android:foregroundServiceType="dataSync"/>

3. 使用WorkManager

对于需要在特定时间或条件下触发的振动,可以考虑使用WorkManager。WorkManager是一个用于处理后台任务的库,可以在满足特定条件时执行任务。

定义一个Worker类来触发振动:

代码语言:txt
复制
public class VibrationWorker extends Worker {
    public VibrationWorker(@NonNull Context context, @NonNull WorkerParameters params) {
        super(context, params);
    }

    @NonNull
    @Override
    public Result doWork() {
        Vibrator vibrator = (Vibrator) getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE);
        long[] pattern = {0, 1000, 500, 1000};
        vibrator.vibrate(pattern);
        return Result.success();
    }
}

调度任务:

代码语言:txt
复制
WorkManager workManager = WorkManager.getInstance(context);
PeriodicWorkRequest vibrationWorkRequest = new PeriodicWorkRequest.Builder(VibrationWorker.class, 15, TimeUnit.MINUTES)
        .build();
workManager.enqueue(vibrationWorkRequest);

应用场景

  • 通知提醒:当应用收到重要通知时,即使在后台也需要触发振动提醒用户。
  • 定时任务:某些应用需要在特定时间触发振动,例如闹钟应用。
  • 游戏互动:在游戏中,即使用户暂时离开应用,也可能需要通过振动提供反馈。

通过上述方法,可以在Android 10 Pie及更高版本中实现后台振动功能,确保应用在各种场景下都能提供良好的用户体验。

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

相关·内容

Android四大组件完全解析(一)---Activity

,持有该activity的进程《在任何时候》都可能被系统杀死,不再执行该activity中的任何一行代码。...例如,如果用户选择写一个新的email,与该email相关的新的条目也必须要创建起来,来保证如果用户去了其他任何的activity这个email不会在草稿中消失。...因为这个原因,任何你在activity之外的后台操作都必须在service和broadcastreceiver的上下文中执行,以保证系统可以保持你的进程运行。...这个操作可以让系统优先考虑你的进程(考虑到它比其他不可见的应用程序更重要),与原始的activity处于何种状态无关 Three 任务栈:Tasks and Back Stack 包括两部分内容 1...一个任务栈是一个整体,当用户开启一个新的任务或者是回到主屏幕需要当前任务栈回到后台时,任务栈整体处于后台状态,任务栈中的activity处于stopped的状态,但是任务栈仍旧是完好的只是被另一个任务栈替代失去焦点而已

1.6K100

网页的生命周期API

一、生命周期阶段 网页的生命周期分成六个阶段,每个时刻只可能处于其中一个阶段。 ? (1)Active 阶段 在 Active 阶段,网页处于可见状态,且拥有输入焦点。...这个阶段会导致网页卸载,任何新任务都不会在这个阶段启动,并且如果运行时间太长,正在进行的任务可能会被终止。...不过,也有可能,处于可见状态的页面长时间没有操作,也会进入 Frozen 阶段。 这个阶段的特征是,网页不会再被分配 CPU 计算资源。...定时器、回调函数、网络请求、DOM 操作都不会执行,不过正在运行的任务会执行完。浏览器可能会允许 Frozen 阶段的页面,周期性复苏一小段时间,短暂变回 Hidden 状态,允许一小部分任务执行。...这时,有可能是全新的页面加载,也可能是从缓存中获取的页面。如果是从缓存中获取,则该事件对象的event.persisted属性为true,否则为false。

1K10
  • Page Lifecycle API 教程

    一、生命周期阶段 网页的生命周期分成六个阶段,每个时刻只可能处于其中一个阶段。 ? (1)Active 阶段 在 Active 阶段,网页处于可见状态,且拥有输入焦点。...这个阶段会导致网页卸载,任何新任务都不会在这个阶段启动,并且如果运行时间太长,正在进行的任务可能会被终止。...不过,也有可能,处于可见状态的页面长时间没有操作,也会进入 Frozen 阶段。 这个阶段的特征是,网页不会再被分配 CPU 计算资源。...定时器、回调函数、网络请求、DOM 操作都不会执行,不过正在运行的任务会执行完。浏览器可能会允许 Frozen 阶段的页面,周期性复苏一小段时间,短暂变回 Hidden 状态,允许一小部分任务执行。...这时,有可能是全新的页面加载,也可能是从缓存中获取的页面。如果是从缓存中获取,则该事件对象的event.persisted属性为true,否则为false。

    86020

    Windows窗口消息和消息队列

    消息队列 所有基于事件驱动的操作系统中的GUI程序,都会在主线程中运行一个消息泵来从消息队列中取出消息并执行对应的处理逻辑。...虽然每个TRHEADINFO都维护线程的这些信息,但当线程不具备活动窗口,键盘焦点,鼠标捕获和提示符时这些成员变量的值都将为NULL。下面将列出所有对消息队列操作的API。...,并且应答消息队列中也没有任何消息。...); //函数调用失败或超时返回0,正确返回TRUE. fuFlags: 可以是如下联合: SMTO_NORMAL: 正常为0, 不与其他联合 SMTO_ABORTIFHUNG: 若是接收线程正处于挂起状态时则只将消息放入接收线程的发送消息队列中...在调用ReplyMessage之后,发送消息的线程恢复执行,而处理消息的线程继续处理消息。两个线程都不会被挂起,都可以正常执行。当处理消息的线程从它的窗口过程返回时,它返回的任何值都被忽略。

    2.6K50

    谷歌重磅推出Android 9:“Pie”已生成,着眼AI

    这次更新的主要焦点是人工智能——随着更新的到来,许多新功能将逐步了解用户的习惯,并利用这些信息来简化Android体验。 谷歌希望通过使用AI,使Pie能让你的手机更智能、更简单、“更适合你”。...只要轻轻一扫,你就能一眼看到设备上所有打开的应用程序,并能随意的在它们之间进行滑动操作。 文本放大镜 当你在这个应用程序视图中,你可以突出显示文本来让Pie的人工智能技术进行工作。...例如,如果你选择一个用餐者的名字,Pie可以向你显示一个Yelp review按钮,以及标准的拷贝、搜索和共享选项。 ?...在Digital Wellbeing界面中,饼状图会显示你最常使用的应用程序或服务,允许你暂停应用程序或屏蔽通知,以避免盲目的内容消耗以及减少干扰。 ?...Android Pie今天将面向Pixel用户推出,但其他用户需等待一段时间——谷歌希望在今年能将更新发布到其合作伙伴的设备上,但目前尚未提供任何进一步的细节信息。 ----

    42920

    Android ANR问题解析(一)

    ANR的类型 用户输入事件处理超时 当应用程序的窗口处于活动状态并且能够接收输入事件(例如按键事件、触摸事件等)时,系统底层上报的事件就会被InputDispatcher分发给该应用程序。...对大多数窗口而言“处于活动状态”可以理解为“获得焦点”,但是一些具有FLAG_NOT_FOCUSABLE属性的窗口,如Popup窗口,不能获得焦点不能接收按键事件只能接收触摸事件,使得这两个概念不能完全等价...当应用程序的窗口处于“活动状态”并且能够接收输入事件时,系统底层上报的事件就会被InputDispatcher分发给该应用程序。...如果由于某种原因,窗口迟迟不能达到“活动状态”,不能接收输入事件,此时InputDispatcher就会报出“窗口获取焦点超时”。...为了研究窗口为什么会获取焦点超时,我们需要简单了解在窗口切换过程中焦点应用和焦点窗口的切换逻辑。假设当前正处于应用A中,将要启动应用B。

    2.5K10

    Android 自定义View小结(重于理解,不作为教程)

    wrap_content表示让View的宽度刚好可以包含其内容,如果设置成具体的数值则View的宽度会变成相应的数值。...如果你去观察TextView、ImageView等类的源码,你会发现它们都有重写onDraw()这个方法,并且在里面执行了相当不少的绘制逻辑。...3.window_focused 表示当前视图是否处于正在交互的窗口中,这个值由系统去自动决定, 应用程序不能进行改变。 selected 表示当前视图是否处于选中状态。...一个界面当中可以有多个视图处于选中状态,调用setSelected()方法能够改变视图的选中状态,传入true表示选中,传入false表示未选中。...4.Selected 表示当前视图是否处于选中状态, 一个界面当中可以有多个视图处于选中状态, 调用setSelected()方法能够改变视图的选中状态, 传入True表示选中, 传入False表示未选中

    33710

    Android 9 Pie新版本入门

    如果您是一个Pixel所有者,您会很高兴地听到这个“Pie”将在今天作为无线更新开始发布。...总的来说,Pie版本是一个可靠的升级。唯一真正令人失望的是,Pie不会在默认情况下推出Android新的数字健康功能。相反,你必须注册一个测试版并拥有一个Pixel设备。...不过你已经习惯了,如果你愿意的话,你可以回到旧的系统。 谷歌对于你喜欢和想要使用的应用程序的建议,当你向上滑动时,感觉像是一个不错的技术演示,但在日常使用中并不是那么有用。...另一个新的机器学习功能是智能文本选择工具,它可以识别您选择的文本的含义,然后允许您建议相关操作,如打开谷歌地图或打开一个地址的共享对话框。...或许谷歌还没有准备好——或许它的合作伙伴还没有构建足够的片段,但无论如何,我们都不会在Android Pie中看到这个功能,估计要等到今年晚些时候。 这是安卓9 Pie。

    1.1K30

    适配可折叠设备,您的应用准备好了吗?

    Multi-resume 目前,Android 系统允许多个应用同时共享屏幕,但是其中只有具有焦点的应用才处于已恢复 (resumed) 状态,其余应用均处于 onPause 状态。...虽然我们在《多窗口支持》一文中已经提供了同屏多应用的实现方法,但是我们发现很多应用并没有按照这些方法来处理 onPause 状态 (视频暂停或停止,即时消息未被显示等)。...为了让开发者能够以最小的工作量实现最佳的多窗口体验,从 Android 9 开始,我们允许设备厂商在多窗口模式下保持所有可见应用处于 resumed 状态。 ?...如果您想在 Android 9 中启用此行为,请在应用清单中加入以下元数据: ? 请注意: 我们将在下个版本的 Android 系统中,优化该行为的兼容性。...点击这里下载 "Android 9 Pie 开发者手册"和 "Android 9 Pie 常见问题及兼容性注意事项"

    70710

    Android Pie 引入 Keystore 新特性,安全防护再升级

    在这篇文章中,我们会详细介绍其中的两项新功能: 其一是通过限制密钥的使用来达到保护敏感信息的目的;其二则是能够在简化安全密钥使用的同时,防止应用和操作系统访问密钥资料。...当设备处于锁屏状态时,密钥可用于加密或认证操作,但是却不可用于解密或者签名。如果设备当前被 PIN, 图形或者密码锁定,任何试图使用这些密钥的操作都会失效。...另外,还有一点请各位读者注意,鉴于安全硬件无法获知屏幕何时被锁定,因此键盘锁绑定由操作系统负责来强制执行而非安全硬件。...但验证绑定的情况则与之不同,它是一款由硬件强制执行的 Android Keystore 特性。当验证绑定与键盘锁绑定配合使用时,设备将具备更高的安全防护级别。...而且,由于键盘锁绑定属于操作系统功能,因此所有 Android Pie 设备都可以使用该功能。 任何由设备支持算法所编写的密钥均可启动键盘锁绑定功能。

    1.1K30

    【Flutter 专题】54 图解 Flutter 基本生命周期

    横竖屏切换 didUpdateWidget -> build -> didUpdateWidget -> build (执行两次) 4....新页面切至后台(旧页面未销毁) 旧/新页面didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState...屏幕大小调整 与 Android 不同,调整屏幕大小不会进行生命周期变化,前提是当前应用已获取焦点,若未获取焦点,则会在调整屏幕大小为全屏时进行获取焦点的生命周期方法; 小总结 生命周期整体分为三个部分...,通常会在此方法中移除监听或清理数据等,整个生命周期只会执行一次; resumed 应用程序可见且获取焦点状态,类似于 Android onResume(); inactive 应用程序处于非活动状态;...paused 应用程序处于用户不可见,不响应用户状态,处于后台运行状态,类似于 Android onPause(); ?

    1.4K41

    【译】W3C WAI-ARIA最佳实践 -- 表单

    如果该组中没有选项被选中,该三态复选框呈现的整体状态为未选中。 用户仅使用一个操作,就可以改变三态复选框组中所有选项的状态: 选中整体复选框,可以选中组中的所有选项。...选中后,复选框元素状态 aria-checked 设置为 true。 如果未选中,它的状态 aria-checked 设置为 false。...- (可选):当焦点位于未选中的menuitemradio上时,不会关闭菜单,选中聚焦的 menuitemradio,并取消选中同一组中的任何其他已选中的 menuitemradio 元素。...请注意,如果没有menubar,例如从一个菜单按钮打开一个菜单,当焦点在一个没有子菜单的项目上时, Right Arrow 不会执行任何操作。...在 Menu or Menu bar 中介绍了菜单元素所需的附加角色,状态和属性。 单选按钮组 单选按钮组,是一个可选中按钮的组合,被称为单选按钮,且在该组合中,只有一个按钮处于选中状态。

    8.3K30

    【Web技术】850- 深入了解页面生命周期API

    如果一个网页被隐藏了很久,而用户没有关闭网页,浏览器会将其冻结,并将网页移动到这个状态。但是,正在运行的任务会继续进行,直到完成。但定时器、回调函数执行和DOM操作将被停止以释放CPU。...除了以上两种状态外,API中还引入了其他四种状态,分别是:。 ACTIVE - 页面可见并有输入焦点。 PASSIVE - 页面可见,但没有输入焦点。 HIDDEN - 页面不可见(也没有冻结)。...HIDDEN状态 - 隐藏状态应该被视为用户在网页上的会话的结束。你可以在此时坚持未保存的应用状态,并停止任何用户不需要在后台运行的UI更新或任务。...Terminated状态 - 由于会话结束逻辑是在隐藏状态下处理的,所以一般不需要任何操作。 Discarded状态 - 这个状态是应用程序无法观察到的。...好了,现在我们知道在每个状态下要做什么了,让我们看看如何在我们的应用程序中捕获每个状态。 如何在代码中捕获生命周期状态?

    1.3K20

    游戏优化系列三:Unity游戏的黑屏问题解决方法

    ,false则表示失去焦点。...原activity仍然是失去焦点的状态(如果没有手动重新获取焦点),当前页面显示黑屏。...(如果游戏对象在启动期间处于非活动状态,则在激活之后才会调用 Awake。) -- OnEnable:(仅在对象处于激活状态时调用)在启用对象后立即调用此函数。...在编辑器中,用户停止播放模式时,调用函数。 -- OnDisable:行为被禁用或处于非活动状态时,调用此函数。...如果根据第二点添加获取焦点方法后,由下图可以看到继续执行的unity脚本生命周期方法,先获取到焦点、中止pause状态并绘制页面进行正常显示。即工程重新获取焦点后才会绘制图像。

    6.2K01

    理解操作系统进程--进程描述

    简单来说,程序只有两种状态:运行态、未运行态。 ? 当操作系统创建一个新进程时,它将该进程以未运行态加入到系统中,操作系统知道进程的存在,并等待执行机会。...上图中的排队图可以描述分派器的行为:被中断的进程转移到等待进程队列中,或者,如果进程以及结束或取消,则被销毁。在任何一种情况下,分派器均从队列中选择一个进程来执行。...(例如,如果操作系统把每个调度队列都保存成链表,则新进程必须放置在就绪或就绪/挂起链表中)。 创建或扩充其他数据结构。 进程终止 有很多事件可以导致进程终止,比如: 进程完成 进程超时。...五状态模型 系统中还存在着一些处于非运行状态但已经就绪等待执行的进程,而且还存在另一些处于阻塞状态等待 I/O 操作结束的进程。...: 阻塞-阻塞/挂起:如果没有就绪进程,则至少一个阻塞进程被换出,为另一个没有阻塞的进程让出空间 阻塞/挂起-就绪/挂起:如果等待事件发生了,比如 I/O 不再阻塞,则处于阻塞/挂起 状态的进程可以转换到

    72021

    UI自动化 --- UI Automation 基础详解

    这些视图是根据执行的过滤类型定义的;任何视图的作用域由应用程序定义。此外,应用程序还可以对属性应用其他过滤器;例如,只在控件视图中包含已启用的控件。...仅用于布局或装饰目的的非交互项不会在控件视图中显示。例如,一个本身不包含任何信息,仅用于布局对话框中的控件的面板。 控件视图中可见的非交互项例如有包含信息的图形和对话框中的静态文本。...例如,一个控件其所具有的滚动条在控件的可视区域中存在的信息超过了可被显示的信息时,便处于活动状态。...通过允许提供程序应用程序有选择地触发事件,根据是否有客户端订阅这些事件,或者如果没有客户端监听任何事件,则可以完全不触发事件,从而提高效率。 UI 自动化事件有以下类型。...例如,如果客户端需要监视应用程序的复选框控件,它可以注册来侦听 ToggleState 属性上的属性更改事件。 选中或取消选中该复选框控件时,提供程序会引发事件且客户端会采取必要的操作。

    3.3K20

    Android 自学笔记

    最终用户不必关心哪些应用处于活动状态,也无需关闭一些程序以便运行其他程序。Android针对电量和内存有限的设备进行了优化。 高品质图形和声音。...它包括必需的类名和应用程序能够处理的事件类型,以及运行应用程序所需的许可。例如,如果应用程序需要访问网络 — 例如为了下载一个文件 — 那么 manifest 文件中必须显式地列出该许可。...();运行 onResume();获取焦点 onPause(); 失去焦点 onStop();暂停 onDestroy();销毁 onRestart(); 重启 Activity四种状态 Active/...Running Activity处于界面顶端,获取焦点。...Paused Activity失去焦点,但是对用户可见。 Stopped Activity完全被遮挡,但保留所有的状态和成员信息。 Killed Activity被销毁

    63520

    Android基础_1 四大基本组件介绍与生命周期

    (Activity或service)调用 监听广播Intent步骤: 1>             写一个继承BroadCastReceiver的类,重写onReceive() 方法,广播接收器仅在它执行这个方法时处于活跃状态...需要注意的是在AndroidManifest文件中进行配置的广播接收者会随系统的启动而一直处于活跃状态,只要接收到感兴趣的广播就会触发(即使程序未运行) AndroidManifest文件中进行注册格式如下...则当前任务遁入后台,而新任务的根activity 显示出来。然后,过了一小会儿,用户再次回到了应用程序加载器而又选择了前一个应用程序(上一个任务)。...2.2.1  四种状态 1.Active/Running——活动状态      当Activity运行在屏幕前台(处于当前任务活动栈的最上面),此时它获取了焦点能响应用户的操作,属于运行状态,同一个时刻只会有一个...Activity 处于活动(Active)或运行 (Running)状态 2.Paused——暂停状态      当Activity失去焦点但仍对用户可见(如在它之上有另一个透明的Activity或Toast

    1.5K30
    领券