首页 > 编程语言 >关闭Java时后台的FM无法恢复

关闭Java时后台的FM无法恢复

时间:2023-04-03 19:08:41浏览次数:38  
标签:mdi Java clear JVM midlet 后台 audio FM


在MVM的版本中,先启动任何本地播放音乐的应用FM/Audio player,此时同时启动多个没有音乐的Java应用,并关闭某一个Java应用,之前后台的FM等无法重新恢复播放。例如: 
1、启动FM -> 启动Java应用A,FM停止播放 -> 后台A -> FM恢复 -> 启动Java应用B,FM停止播放-> 后台B -> FM恢复-> 直接在resume dialog关闭A/B都不影响FM恢复。(正常) 
2、启动FM -> 启动Java应用A,FM停止播放 -> 后台A -> FM恢复 ->启动Java应用B,FM停止播放-> 后台B -> FM恢复-> resume A/B -> 退出A/B -> FM起不来,除非java全部退出。(不正常) 
[SOLUTION] 
分析: 
不发声的midlet在bg时,让FM启动,是因为jam_resmgr_audio_controller()中,判断是否有jma的audio player。如果有,就清掉其他app的mdi bg handler;如果没有,就清掉自己的,代码如下: 

else if (src == JVM_FG_RUNNING_STATE && dst == JVM_BG_RUNNING_STATE || 

  src == JVM_FG_MMI_RUNNING_STATE && dst == JVM_BG_RUNNING_STATE || 

  src == JVM_LONG_EVENT_STATE && dst == JVM_BG_RUNNING_STATE) 

  { 

  if (jma_audio_player_is_active()) 

  { 

  /* Java must be highest priority. */ 

  mdi_audio_clear_other_background_handler(MDI_BACKGROUND_APP_JAVA); 

  } 

  else 

  { 

  mdi_audio_clear_background_handler(MDI_BACKGROUND_APP_JAVA); 

  } 

  }


问题的原因在于,退出一个midlet(当时还有其他的midlet在bg)时,走到如下代码。做的事情只是判断是不是最后一个退出的midlet,如是,清除java自己的mdi bg handler。否则,什么都不做。 
在退出一个midlet(当时还有其他的midlet在bg)时,我们只把此时的场景设计成midlet退出,但忽略此时隐含着未退出的midlet进入bg,代码如下: 

if (dst == JVM_TERMINATE_STATE) 

  { 

  /* Rest the context when the last JVM exit */ 

  if (JVM_RUNNING_NUM_1 == jam_mvm_get_running_count()) 

  { 

  mdi_audio_clear_background_handler(MDI_BACKGROUND_APP_JAVA); 

  jma_media_player_clear_parameter(KAL_FALSE); 

  /* De-register bt callback when midlet is terminated */ 

  #ifdef __BT_SPK_VOL_CONTROL__ 

  mdi_audio_bt_clear_volume_sync_callback(APP_JAVA); 

  #endif 

  }  

 }


解决方法: 
应当判断java bg后是该让java继续发声还是其他app发声,将进入bg的逻辑添加到terminate逻辑中。 

if (dst == JVM_TERMINATE_STATE) 

  { 

  /* Rest the context when the last JVM exit */ 

  if (JVM_RUNNING_NUM_1 == jam_mvm_get_running_count()) 

  { 

  mdi_audio_clear_background_handler(MDI_BACKGROUND_APP_JAVA); 

  jma_media_player_clear_parameter(KAL_FALSE); 

  /* De-register bt callback when midlet is terminated */ 

  #ifdef __BT_SPK_VOL_CONTROL__ 

  mdi_audio_bt_clear_volume_sync_callback(APP_JAVA); 

  #endif 

  }  

 //modify begin 

  else if(jma_audio_player_is_active()) 

  { 

  /* Java must be highest priority. */ 

  mdi_audio_clear_other_background_handler(MDI_BACKGROUND_APP_JAVA); 

  } 

  else 

  { 

  mdi_audio_clear_background_handler(MDI_BACKGROUND_APP_JAVA); 

  } 

  //modify end 

  }

标签:mdi,Java,clear,JVM,midlet,后台,audio,FM
From: https://blog.51cto.com/u_15170706/6167064

相关文章

  • JAVA列表中屏蔽预置程序
    1.Jam_interface.h中添加FilterType。 typedefenum{JAM_NONE_FILTER=0,JAM_DISK_FILTER=0x01,JAM_TRUST_FILTER=0x02,JAM_VENDOR_FILTER=0x04,JAM_DEFAULT_GAME_FILTER=0x08,JAM_NONDEFAULT_GAME_FILTER=......
  • 55个手机JAVA全屏触屏游戏
    55个游戏我就不一一列举名字了,适合所有触屏手机,全触屏游戏,大部分测试通过,太多了我也没一个一个看,保证能玩就行了thunder://QUFodHRwOi8vd3d3Ljc4eXguY29tL3NvcnQvbWRvd24vMS81NSVCOCVGNiVDQSVENiVCQiVGQUpBVkElQzglQUIlQzYlQzElQjQlQTUlQzYlQzElRDMlQ0UlQ0YlQjcucmFyWlo=......
  • Java记录唯一性check
    /***记录唯一性check**@paramid主键*@paramentity实体记录,必须实现equals()方法才能验证更新的场合*@paramfields唯一键字段名称*/if(entity==null||fields.length==0){return;}try{@SuppressWarnings("unchecked")......
  • 解决java注解处理器生成的方法,在编译时报错“找不到符号”
    我的注解处理器,添加的其中一个方法中有一段AST代码如下:JCTree.JCFieldAccessobjectsIsNull=maker.Select(maker.Ident(names.fromString("java.util.Objects")),names.fromString("isNull"));JCTree.JCIfifExpr1=maker.If(maker.Apply(List.nil(),objectsI......
  • 【Java 并发】【七】【Unsafe】什么是Unsafe及其作用
    1 前言这节我们来看看JDK底层的unsafe,因为很多的操作都是依赖于unsafe提供的功能的。2  unsafe是什么?unsafe是JDK提供的一个工具类,里面的方法大多是native方法,unsafe类是JDK给你提供的一个直接调用操作系统底层功能的一个工具类,unsafe提供了非常多操作系统级别的方法。(1)比......
  • PaddleOCR服务部署-并通过Java进行调用
    文章转载自: https://blog.csdn.net/f2315895270/article/details/128150679选择部署方式  官方推荐有以下几种:  Python推理  C++推理  Serving服务化部署(Python/C++)  Paddle-Lite端侧部署(ARM CPU/OpenCLARMGPU)  Paddle.js部署     由于我......
  • 【Java虚拟机探究】10.类装载器(下)
    上一篇我们总结了类加载器的基本原理和与应用程序相关的ClassLoader,并提到了双亲委派模式。本篇继续探讨类加载器的双亲委派模式,以及如何破坏双亲委派模式达到加载底层类的目的。1.双亲委派模式的问题我们回顾一下原来的应用程序的ClassLoader的加载模式:除了顶层的ClassLoader,每......
  • 【Java虚拟机探究】9.类装载器(上)
    在JVM类要通过类装载器(ClassLoader)进行装载后,才能进行执行。本篇总结了类装载器的一些知识。一、class装载验证流程在第一篇总结中介绍了JVM的内存结构:可以看到class文件首先要通过“类加载器子系统”,才能被加载到内存中处理。那么class文件是怎么通过类加载器加载至内存中的呢......
  • 【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接
    上一篇我们讲解了如何配置和启动FastDFS客户端,以及客户端上传下载的一些常用命令。那么,在许多需要进行分布式文件上传与下载的系统中,就不能像执行Linux命令一样去上传和下载文件,它们需要使用开发系统的语言去操作客户端使用其命令与服务端进行交互,此时FastDFS......
  • C# 后台服务监控SQL Server数据库表改动并同步到MySQL数据库表
    需求将A服务器的sqlserver数据库item_mst表的数据同步到MySQL数据库Part表监控Item_mst表中item,description,overview的更改并同步到MySQL数据库 针对需求一,基本就是执行一次,单独写了个winform用来做这事针对需求二,写了个Windowsserviceapp Nuget安装 Dapper就是个ormSeril......