首页 > 其他分享 >Launcher start App WINDOWING_MODE_FREEFORM

Launcher start App WINDOWING_MODE_FREEFORM

时间:2024-08-28 17:53:19浏览次数:5  
标签:java Launcher App ItemClickHandler FREEFORM intent android com launcher3

WINDOWING_MODE_FREEFORM start App

核心思路:
这个windowmode需要从FullScreen ---> Freeform,
需要在startActivity时候携带相关相关参数,把windowmode和launchBounds进行设置。

Android T


+++ b/frameworks/base/core/java/android/app/Instrumentation.java
@@ -1798,6 +1798,7 @@ public class Instrumentation {
     public ActivityResult execStartActivity(
             Context who, IBinder contextThread, IBinder token, Activity target,
             Intent intent, int requestCode, Bundle options) {
+        android.util.Log.d("tag",Log.getStackTraceString(new Throwable()));
         IApplicationThread whoThread = (IApplicationThread) contextThread;
         Uri referrer = target != null ? target.onProvideReferrer() : null;
         if (referrer != null) {

//打印堆栈,查看一下堆栈,清晰看见整个startActivity的过程
//清楚知道在哪里启动的onClick且一步步到对应的startActivity...,这里寻找最贴近context的startActivity...

java.lang.Throwable
                    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1801)
                    at android.app.Activity.startActivityForResult(Activity.java:5522)
                    at com.android.launcher3.Launcher.startActivityForResult(Launcher.java:1895)
                    at com.android.launcher3.uioverrides.QuickstepLauncher.startActivityForResult(QuickstepLauncher.java:833)
                    at android.app.Activity.startActivity(Activity.java:5974)
                    at com.android.launcher3.views.ActivityContext.startActivitySafely(ActivityContext.java:356)
                    at com.android.launcher3.Launcher.startActivitySafely(Launcher.java:2259)
                    at com.android.launcher3.uioverrides.QuickstepLauncher.startActivitySafely(QuickstepLauncher.java:348)
                    at com.android.launcher3.touch.ItemClickHandler.startAppShortcutOrInfoActivity(ItemClickHandler.java:351)
                    at com.android.launcher3.touch.ItemClickHandler.onClickAppShortcut(ItemClickHandler.java:309)
                    at com.android.launcher3.touch.ItemClickHandler.onClick(ItemClickHandler.java:94)
                    at com.android.launcher3.touch.ItemClickHandler.$r8$lambda$c3IcSovkrXGdCZtXy0f_A5Sz5VA(Unknown Source:0)
                    at com.android.launcher3.touch.ItemClickHandler$$ExternalSyntheticLambda6.onClick(Unknown Source:0)
                    at com.android.launcher3.uioverrides.QuickstepLauncher.onItemClicked(QuickstepLauncher.java:387)
                    at com.android.launcher3.uioverrides.QuickstepLauncher$$ExternalSyntheticLambda9.onClick(Unknown Source:2)
                    at android.view.View.performClick(View.java:7542)
                    at android.view.View.performClickInternal(View.java:7519)
                    at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
                    at android.view.View$PerformClick.run(View.java:29476)
                    at android.os.Handler.handleCallback(Handler.java:942)
                    at android.os.Handler.dispatchMessage(Handler.java:99)
                    at android.os.Looper.loopOnce(Looper.java:201)
                    at android.os.Looper.loop(Looper.java:288)
                    at android.app.ActivityThread.main(ActivityThread.java:7924)
                    at java.lang.reflect.Method.invoke(Native Method)
                    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
                    


+++ b/packages/apps/Launcher3/src/com/android/launcher3/views/ActivityContext.java

default boolean startActivitySafely(
            View v, Intent intent, @Nullable ItemInfo item) {
        Preconditions.assertUIThread();
        Context context = (Context) this;
        ...
        try {
            boolean isShortcut = (item instanceof WorkspaceItemInfo)
                    && (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT
                    || item.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT)
                    && !((WorkspaceItemInfo) item).isPromise();
            if (isShortcut) {
                // Shortcuts need some special checks due to legacy reasons.
                startShortcutIntentSafely(intent, optsBundle, item);
            } else if (user == null || user.equals(Process.myUserHandle())) {
                // Could be launching some bookkeeping activity
                //add text
                Log.e("tag", "WINDOWING_MODE_FREEFORM launcher");
                ActivityOptions activityOptions = ActivityOptions.makeBasic();
                activityOptions.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM);
                final Rect rect = new Rect(0, 0, 480, (int) (480 * 0.5f));
                activityOptions.setLaunchBounds(rect);
                context.startActivity(intent, activityOptions.toBundle());
                //context.startActivity(intent, optsBundle);
                //add text
            } else {
                context.getSystemService(LauncherApps.class).startMainActivity(
                        intent.getComponent(), user, intent.getSourceBounds(), optsBundle);
            }
        ...
    
    } 
    

补充:
如果发现修改无效,检查是否打开系统的自由窗口模式

adb shell settings put global enable_freeform_support  1
adb shell settings put global force_resizable_activities  1

或者

开发者模式下开启小窗功能,开发者模式下打开如下两个开关,然后重启即可.

Android13深入了解 Android 小窗口模式和窗口类型
copy
参考

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

public static final int FLAG_ACTIVITY_RESET_TASK_IF_NEEDED = 0x00200000;
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
//如果没有新的,就会new 一个新的TASK,如果存在旧的TASK,使用旧的TASK(正在启动的Activity的Task已经在运行的话,那么新的Activity将不会启动)

标签:java,Launcher,App,ItemClickHandler,FREEFORM,intent,android,com,launcher3
From: https://www.cnblogs.com/kato-T/p/18385263

相关文章

  • Java后端微服务架构下的服务链路追踪:Dapper与Pinpoint
    Java后端微服务架构下的服务链路追踪:Dapper与Pinpoint大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在微服务架构中,服务链路追踪是一种关键技术,用于监控和诊断服务间的调用关系和性能问题。Dapper和Pinpoint是两种流行的服务链路追踪系统。服务链......
  • 工业和信息化部通报2024年第7批涉嫌侵害用户权益的APP和SDK
    ​ 工业和信息化部近日公布了一批存在安全问题的APP和SDK名单,这些应用和软件开发工具包(SDK)因违反相关法律法规,涉及违规收集个人信息、信息窗口乱跳转等问题被通报。    此次通报的APP和SDK涉及多个应用领域,包括记账、游戏、实用工具、影视、网络加速、广告服务等。通报......
  • Linux APP查询驱动的方式归类总
    LinuxAPP查询驱动的方式归类总前言一、具体方式是什么?1、休眠与唤醒2、阻塞与非阻塞3、POLL机制4、异步通知tips:等待队列用于进程等待条件,工作队列用于异步任务处理。二、使用步骤休眠与唤醒tips:在中断处理函数中,不能休眠,也就不能调用会导致休眠的函数。上半......
  • uniapp js 数独小游戏 9*9 数独 2.0
    效果图: game.vue<template> <view> <viewclass="main"> <viewclass="foot"> <viewv-if="!isTip"class="sudoku_area"> <viewv-for="(row,index)ofrowList":key=&quo......
  • uniapp js 数独小游戏 n*n 看控制台的打印 数独 1.0
    uniappjs 数独小游戏n*n 看控制台的打印game.vue<template> <view>4567</view></template><scriptsetuplang="ts">import{ref}from'vue'import{onShow}from'@dcloudio/uni-app'constsdNum=ref(......
  • 109.微软邮箱强制要求使用MS Authenticator手机APP但中国没有GooglePlay的处理办法
    109.微软邮箱强制要求使用MSAuthenticator手机APP但中国没有GooglePlay的处理办法  背景: 微软邮箱强制用户使用它的Authenticator手机验证器APP(只能跳过3次), 而大部分中国用户手机上是没有谷歌框架和GooglePlay的,所以导致很多用户无法使用微软企业邮箱微软自己也发现了......
  • 面试必考问题:Android APP耗电最全解析和优化指南
    目录1AndroidAPP耗电原因分析1.1后台应用持续运行1.2高CPU使用率1.3网络使用不当1.4错误代码实现2Android不同版本的耗电优化功能2.1JobSchedulingAPI与BatteryHistorian2.2JobSchedulingAPI的深入解析2.3BatteryHistorian的实际应用2.4结合JobSch......
  • 掀起社交娱乐新浪潮!AI如何应用到短视频APP?
    随着人工智能技术的迅速发展和全球社交媒体用户的增长,AI视频生成应用正逐渐成为短视频社交媒体中的关键工具。AI工具不仅可以提高内容的创造效率,还能为用户带来全新的互动体验。人工智能(AI)已经成为我们日常生活和工作中不可或缺的一部分,随着数据的爆炸性增长和计算能力的提......
  • 导购APP的用户隐私保护与安全设计
    导购APP的用户隐私保护与安全设计大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在数字化时代,用户隐私保护和数据安全成为电商导购APP开发中不可忽视的重要环节。本文将探讨导购APP在用户隐私保护和安全设计方面的策略和技术实现。用户隐私保......
  • 网络爬虫中Fiddler抓取PC端网页数据包与手机端APP数据包
      Fiddler是常用的数据包捕获软件,具有分析请求数据、设置断点、调试web应用、修改请求的数据等功能,本文对如何用Fiddler抓取HTTP、HTTPS、手机APP数据包介绍了,另外还补充介绍了数据包过滤的功能。1引言在编写网络爬虫时,第一步(也是极为关键一步)就是对网络的请求(reque......