首页 > 其他分享 >Android 《回到桌面与切换到任务列表》

Android 《回到桌面与切换到任务列表》

时间:2024-03-11 15:13:42浏览次数:23  
标签:接收器 桌面 画中画 广播 模式 列表 reason Android

App不但能监测手机屏幕的方向变更,还能获知回到桌面的事件,连打开任务列表的事件也能实时得知。回到桌面与打开任务列表都由按键触发,例如按下主页键会回到桌面,按下任务键会打开任务列表。虽然这两个操作看起来属于按键事件,但系统并未提供相应的按键处理方法,而是通过广播发出事件信息。因此,若想知晓是否回到桌面,以及是否打开任务列表,均需收听系统广播Intent.ACTION_CLOSE_SYSTEM_DIALOGS。至于如何区分当前广播究竟是回到桌面还是打开任务列表,则要从广播意图中获取原因reason字段,该字段值为homekey时表示回到桌面,值为recentapps时表示打开任务列表。接下来演示一下此类广播的接收过程。首先定义一个广播接收器,只处理动作为Intent.ACTION_CLOSE_SYSTEM_DIALOGS的系统广播,并判断它是主页键来源还是任务键来源。该接收器的代码定义示例如下:

// 定义一个返回到桌面的广播接收器
private class DesktopRecevier extends BroadcastReceiver {
   // 在收到返回桌面广播时触发
   @Override
   public void onReceive(Context context, Intent intent) {
       if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
           String reason = intent.getStringExtra("reason"); // 获取变更原因
           // 按下了主页键或者任务键
           if (!TextUtils.isEmpty(reason) && (reason.equals("homekey")|| reason.equals("recentapps"))) {
               showChangeStatus(reason); // 显示变更的状态 
      		}
      	  } 
 	} 
}

接着在活动页面的onCreate方法中注册接收器,在onDestroy方法中注销接收器,其中接收器的注册代码如下所示:

private DesktopRecevier desktopRecevier; // 声明一个返回桌面的广播接收器对象 
// 初始化桌面广播
private void initDesktopRecevier() {
   desktopRecevier = new DesktopRecevier(); // 创建一个返回桌面的广播接收器 
   // 创建一个意图过滤器,只接收关闭系统对话框(即返回桌面)的广播
   IntentFilter intentFilter = new
IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
   registerReceiver(desktopRecevier, intentFilter); // 注册接收器,注册之后才能正常接收广播
}

可是监听回到桌面的广播能用来干什么呢?一种用处是开启App的画中画模式,比如原先应用正在播放视频,回到桌面时势必要暂停播放,有了画中画模式之后,可将播放界面缩小为屏幕上的一个小方块,这样即使回到桌面也能继续观看视频。注意从Android 8.0开始才提供画中画模式,故而代码需要判断系统版本,下面是进入画中画模式的代码例子:

// 显示变更的状态
private void showChangeStatus(String reason) {
   mDesc = String.format("%s%s 按下了%s键\n", mDesc, DateUtil.getNowTime(), 
reason);
   tv_monitor.setText(mDesc);
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
       && !isInPictureInPictureMode()) { // 当前未开启画中画,则开启画中画模式 
       // 创建画中画模式的参数构建器
       PictureInPictureParams.Builder builder = new 
PictureInPictureParams.Builder();
       // 设置宽高比例值,第一个参数表示分子,第二个参数表示分母 
       // 下面的10/5=2,表示画中画窗口的宽度是高度的两倍
       Rational aspectRatio = new Rational(10,5);
       builder.setAspectRatio(aspectRatio); // 设置画中画窗口的宽高比例
       // 进入画中画模式,注意enterPictureInPictureMode是Android8.0之后新增的方法 
       enterPictureInPictureMode(builder.build());
 } 
}

以上代码用于开启画中画模式,但有时希望在进入画中画之际调整界面,则需重写活动的onPictureInPictureModeChanged方法,该方法在应用进入画中画模式或退出画中画模式时触发,在此可补充相应的处理逻辑。重写后的方法代码示例如下:

// 在进入画中画模式或退出画中画模式时触发
@Override
public void onPictureInPictureModeChanged(boolean isInPicInPicMode, 
Configuration newConfig) {
   Log.d(TAG, "onPictureInPictureModeChanged 
isInPicInPicMode="+isInPicInPicMode);
   super.onPictureInPictureModeChanged(isInPicInPicMode, newConfig); 
   if (isInPicInPicMode) { // 进入画中画模式
  } else { // 退出画中画模式 
 }
}

另外,画中画模式要求在AndroidManifest.xml中开启画中画支持,也就是给activity节点添加supportsPictureInPicture属性并设为true,添加新属性之后的activity配置示例如下:

<activity
         android:name=".ReturnDesktopActivity"
         android:configChanges="orientation|screenLayout|screenSize" 
         android:supportsPictureInPicture="true"
         android:theme="@style/AppCompatTheme" />

标签:接收器,桌面,画中画,广播,模式,列表,reason,Android
From: https://www.cnblogs.com/paylove/p/18066113

相关文章

  • Android 《屏幕切换》
    默认处理机制除了系统广播之外,App所处的环境也会影响运行,比如手机有竖屏与横屏两种模式,竖屏时水平方向较短而垂直方向较长,横屏时水平方向较长而垂直方向较短。两种屏幕方向不但造成App界面的展示差异,而且竖屏和横屏切换之际,甚至会打乱App的生命周期。无需重启Activity横竖屏......
  • Android 获取设备的CPU型号和设备型号
    原文:Android获取设备的CPU型号和设备型号-Stars-One的杂货小窝之前整的项目的总结信息,可能不太全,凑合着用吧,代码在最下面一节CPU型号数据华为:ro.mediatek.platformvivo:ro.vivo.product.platformoppo:ro.board.platform或ro.product.board三星:ro.board.pla......
  • Android 获取设备的亮度百分比
    一般的屏幕亮度都是0-255,而小米手机的高版本不一样为了使亮度调节更加细腻,MIUI对原生亮度级别进行了扩展,由原有的255级调整根据不同屏幕分别支持255/1023/2047/4095级。开发者在进行亮度调整时需要先去确认机型亮度的最大值和最小值,然后进行比例调整。计算屏幕亮度fung......
  • Android 《系统广播》
    一.接收系统的分钟广播TimeReceiver.javapackagecom.xian.app.broadcast.receiver;importandroid.content.BroadcastReceiver;importandroid.content.Context;importandroid.content.Intent;importandroid.util.Log;importjava.util.Date;publicclassTimeReceiv......
  • Android Studio 2021 Gradle 下载失败时,解决方法
    我是mac,Androidstudio2021,创建一个android项目,gradle下载失败,折腾了半天,以下是解决方法:1.出现的错误: 无法下载gradle,2.解决方法使用腾讯的镜像,这里的 地址为:https://mirrors.cloud.tencent.com/gradle/gradle-8.4-all.zip后面的版本可以按自己的需求随意切换然......
  • 【测试】Android Studio 相关下载及参数
    AndroidStudio仅限命令行工具ZipfilesWindows:commandlinetools-win-11076708_latest.zip(153.6MB)SHA-256Checksums4d6931209eebb1bfb7c7e8b240a6a3cb3ab24479ea294f3539429574b1eec862commandlinetools-win-11076708_latest.zipAndroidEmulatorAndroid模拟器......
  • Delphi11安装Android安卓SDK
    由于Google的AndroidSDK不再允许其他程序分发。Delphi11安装后,默认是没有Android安卓SDK的,在默认安装路径的情况下,在C:\Users\Public\Documents\Embarcadero\Studio\22.0\CatalogRepository\AndroidSDK-2525-22.0.46141.0937\目录下面,只有最基本的安卓SDK的命令行工具,我们可以使......
  • 淘宝订单AP I淘宝订单数据接口 获取商品订单列表 获取商品订单详情
    淘宝订单API是淘宝开放平台提供的一组接口,允许开发者获取淘宝或天猫的订单数据,包括订单列表和订单详情。要使用这些API,你需要遵循一定的步骤来获取并接入这些接口。以下是获取淘宝订单数据的基本步骤:注册并创建应用首先,你需要在淘宝开放平台注册账号,并创建一个应用。创建应用......
  • 区块链钱包-android篇
    ​1:使用ProtocolBuffers 首先根目录gradle中添加依赖:classpath"com.google.protobuf:protobuf-gradle-plugin:0.8.3"然后项目文件中添加plugin,添加依赖包:applyplugin:'com.google.protobuf'protobuf{protoc{artifact='com.google.protobuf:protoc:3.6.1......
  • VB.NET 在DataGridview 动态添加下拉列表控件DataGridViewComboBoxColumn要点两次才可
     DataGridview属性EditMode设为EditOnEnter 添加如下事件代码PrivateSubdgvZhiJianXiangMu_CellClick(ByValsenderAsSystem.Object,ByValeAsSystem.Windows.Forms.DataGridViewCellEventArgs)HandlesdgvZhiJianXiangMu.CellClickIfe.ColumnIndex>=0AndAls......