最近一直在做Android系统定制的项目,核心就是在Android系统中加载flash文件实现各种操作。先一步一步来说下整个方案吧,或许正是读者急需知道的思路。

1、预装Adobe Flash插件

到Adobe官网下载最新的Android Flash插件,拷贝到ROM包编译之后的out目录以下的systerm目录下,该目录是系统应用app,开机就会把插件装好了!

2、为Flash插件添加flash文件的安全路径

该步奏是为了实现flash文件能够与Android的APP交互实现,如果只是单单显示flash的话,可以省略。

在"/data/data/com.ideal.swfplayer/app_plugins/com.adobe.flashplayer/.macromedia/Flash_Player/

#Security/FlashPlayerTrust/flashplayer.txt"里面写入你所要加载的flash文件的完全路径。

3、Android加载flash动画

用html文件加载swf文件,然后Android中利用WebView加载该html文件,间接实现加载swf动画,其中的好处在于可以在html文件中嵌入javascript代码实现swf文件与Android App的交互。具体如何实现WebView加载flash文件以及如何进行交互的源码在我的博客:Android通过javascript与flash动画交互

4、加载flash文件蓝色打问号小方块界面

该方案正常运行,但是,有一个偶然现象:大概有5%的机会在加载flash文件时会出现一个蓝色打问号小方块界面,经过排除,确定时加载flash是Adobe Flash的插件没运行     起 来,但是咧,查看eclipse中的DDMS的进程列表确实存在Adobe Flash插件呀!再次排查之后确定问题出在时系统开机时flash插件以及我的flash APP的运行顺序的问题。     怎么说呢?首先我的APP我设置成系统应用,开机自启动,Adobe Flash插件也是系统应用,这样就存在谁先起来的问题了,假如我的APP先起来的话,当加载flash文件时发   现没有flash插件,当然会出现蓝色小方块了(加载失败)。所以理解了错误根源之后再想解决方案。

我的思路是:让我的APP代码中一运行就检查flash插件是否存在,不存在则延迟加载flash文件,直到检测到为止,代码如下:

//每500ms检测flash插件是否起来

Handler flash_handler = new Handler();

Runnable flash_Thread = new Runnable(){

public void run() {

CheckNumber++;

if(mFileOperation.CheckFlash()){

Log.e("flash_ok", "OK");

flash_handler.removeCallbacks(flash_Thread);

//1秒之后启动应用

loadSwf(FlashPath.MainPath);

}else{

Log.e("flashnone", "None");

flash_handler.postDelayed(flash_Thread, 500);

//提示重启机器

if(CheckNumber>=10){

mDialogOperation.ShowTips(R.drawable.reboot,10);

flash_handler.removeCallbacks(flash_Thread);

}

}

}

};

其中checkflash函数定义如下:

//判断flash插件是否存在

public boolean CheckFlash() {

PackageManager pm = mContext.getPackageManager();

List infoList = pm.getInstalledPackages(PackageManager.GET_SERVICES);

for (PackageInfo info : infoList) {

if ("com.adobe.flashplayer".equals(info.packageName)) {

return true;

}

}

return false;

}

然后在create函数启动该方法即可:

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_flash);

//初始化UI界面

InitUI();

//初始化配置

InitConfig();

//启动定时检测flash插件是否存在,才能在则加载主界面

flash_handler.post(flash_Thread);

}如此,该问题得到解决。经测试,大概开关机300次会出现一次该现象,已经不影响使用。

5、加载flash大文件偶然会出现内存溢出导致异常退出

Android中加载flash文件非常耗内存,而且会一直积累着,到达一定程度之后就会出现内存溢出,然后整个应用重启了。这个问题该如何解决呢?先普及一下Android的内存       管理机制吧~

Android系统每个正在运行的APP都是一个进程,APP里面可以分出很多线程。Android系统为每个进程分配了一个可以自适应伸缩但是最大值固定的堆,叫Heap,该堆是的 最大值是无法改变的,所以一旦在一个进程中的内存接近或者超过了该堆得大小,就会发生内存溢出的异常。我的情况是这样的:APP主界面加载一个比较大的flash,然后在这个界面上发送各种动作之后跳转到另外界面加载另外的flash文件,所以会导致一个进程多个flash文件堆积,时间一久堆内存就会满了。所以我们的解决方案就围绕着怎么利用单个进程单个堆的局限去优化。所以我选择跳转到另外界面加载flash时新开一个进程(即新开一堆),这样就解决了内存溢出的问题。怎么实现呢?

假如我的主进程名叫:com.ideal.swfplayer

新进程名叫:com.ideal.darlingcard

我要跳转加载另外flash的Activity名字叫:DarlingCardFlashActivity.java

(1)修改AndroidManifest.xml   的activity(com.ideal.darlingcard为新开辟的进程名)

android:name=".DarlingCardFlashActivity"

android:launchMode="singleTask"

android:process="com.ideal.darlingcard">

(2)在AndroidManifest.xml 的application添加中添加硬件加速设置

android:largeHeap="true"

android:hardwareAccelerated="true"(3)在DarlingCardFlashActivity.java最后代码中加入以下代码,让该Activity退出后自动杀死本进程

@Override

protected void onDestroy() {

super.onDestroy();

android.os.Process.killProcess(android.os.Process.myPid());

}如上方式可以解决内存溢出的问题,大大降低了出现该问题的概率。具体两个进程的效果可以查看以下的效果图~

6、如何查看应用的内存使用情况

方式一:通过eclipse的DDMS查看,步奏如下:

方式二:通过adb调试工具查看

adb shell

procrank

方式一:通过eclipse的DDMS查看,步奏如下:

android程序 获取flash容量大小,Android用WebView加载flash大文件偶然会出现内存溢出以及蓝色打问号小方块问题的解决方案...相关推荐

  1. 学习笔记:android下获取sdcard容量大小

    在日常开发中,有时候需要对SDCard的容量先进行判断再存储文件.我们可以通过查看android关于setting功能的源代码,以便找到获取sdcard可用空间的方法. 获取sdcard容量大小的主要 ...

  2. android使用webview加载flash文件

    android 字段webview几乎实现了浏览器的全部功能,最近在使用webview加载不固定格式的文章,文章中有一部分嵌入了flash,下面就是webview可以进行视频需要进行的设置,代码如下: ...

  3. Android Studio Webview加载assets本地文件

    1.新建assets资源文件 右键单击main目录,选择New>Folder>Assets Folder. 勾选Change Folder Location可改变其默认路径 在Assets ...

  4. flash调用swf文件服务器,浏览器如何加载Flash文件? (SWF)

    加载Flash文件有很多部分,更常见的是HTML页面. 我将从HTML页面的顶部开始,我敦促其他人纠正我可能犯的任何错误. 加载页面 当收到HTML页面时,浏览器会将其解析为文档对象模型(DOM),以 ...

  5. Android杂谈---获取手机屏幕大小

    Android杂谈---获取手机屏幕大小 SurfaceView简单例子 玩转Android---UI篇---ZoomControls放大缩小图片 更多相关推荐 这里总结下android中关于手机屏幕 ...

  6. android调用音量方法,android中获取当前音量大小

    android中获取当前音量大小 (2012-11-07 08:40:41) 标签: it 通过程序获取android系统手机的铃声和音量.同样,设置铃声和音量的方法也很简单! 设置音量的方法也很简单 ...

  7. android 组件大小,Android编程获取组件尺寸大小的方法

    本文实例讲述了Android编程获取组件尺寸大小的方法.分享给大家供大家参考,具体如下: 在oncreate()中利用view.getWidth()或是view.getHeiht()来获取view的宽 ...

  8. Android中获取WebView加载的html中console.log输出的内容

    场景 Android中使用WebView加载本地html并支持运行JS代码和支持缩放: Android中使用WebView加载本地html并支持运行JS代码和支持缩放_BADAO_LIUMANG_QI ...

  9. android应用程序开发答案,第1章 Android概述--1.2 Android程序【含答案】 Android应用开发基础...

    (1)单选题 1 Android程序启动最先加载AndroidManifest.xml文件,如果有多个Activity,请问()属性决定了Activity最先被加载? A  android.inten ...

  10. Android WebView加载网页,图片等元素宽度大小不兼容手机屏幕的宽度

    无论是Android手机还是iOS手机,使用WebView加载一些没有专门为手机屏幕做适配的网页的时候,就会出现网页中的图片等标签元素的宽度大小和手机屏幕的宽度不一致的情况,如下图 之所以会出现上面的 ...

最新文章

  1. python快速入门第3版 数据_Python 快速入门 第3版
  2. html属性选择器怎么写,html – 具有“type”属性与make-up属性的CSS属性选择器和区分大小写...
  3. LeetCode 1235. 规划兼职工作(动态规划+二分查找)
  4. 【Java】位运算判断2的N次幂
  5. java 同步块关键字_Java同步关键字,同步方法和块
  6. 无法使用XXXX附加到应用程序解决办法
  7. 基于redis实现活跃用户统计功能
  8. 测试分类 test catagory
  9. windows防火墙是干什么的_windows防火墙作用介绍
  10. Git 克隆大型仓库失败解决方法
  11. 第一回 开篇 D3D渲染流程简介
  12. 50+ Best Unity Assets: Shader, Editor Extensions, Level Editors, Models, Terrain
  13. 2021年电工(初级)考试题库及电工(初级)复审考试
  14. java长方体的父类_编写java程序,输入一个长方体的长、宽、高,求长方体的表面积和体积,并将结果显示...
  15. Photoshop脚本 批量生成各尺寸的iOS图标
  16. bshare手动分享网址到QQ空间、朋友网等常用网站代码
  17. 短视频拍摄技巧和器材介绍
  18. python做乘法运算定律_四年级乘法运算定律-
  19. 【多图超详细】从零开始安装配置Cuckoo sandbox并提交样本进行分析
  20. python将eps文件转jpeg文件

热门文章

  1. 7z命令行压缩加密文件
  2. linux复制文件到另一个文件夹
  3. Java实现基于Socket的pbft算法
  4. 微信公众号推送html文件,如何利用微信公众号推送教学资源?
  5. 重磅 | 2020年区块链领域全球授权专利报告
  6. 计算机开机错误0xc0000428,启动时出现错误码0xc0000428如何解决?
  7. SIM868模块+Arduino将位置信息上传到服务器
  8. 软件测试的岗位划分和主要工作内容是怎样的?
  9. java 使用POI导入复杂excel表格
  10. h5难做吗_H5如何制作?制作H5是否很难?-