Android_BUG_201501

本文详细介绍了在Android应用开发中遇到的三个常见问题及其解决方案:Service运行异常、Camera被其他进程占用导致的异常终止、如何在Service中更新AppWidget以及如何在Activity中设置PopupWindow动画。通过解决这些问题,开发者能够更高效地进行应用开发。



1、Service运行2小时之后被系统关闭

我的Service在真机上运行了大约1~2小时之后,被系统关闭然后重新创建。
onStartCommand() 返回的是 START_STICKY,但是,当系统重新创建该Service之后,只调用了 onCreate(),
并没有调用Service 的 onStartCommand()。


解决办法: 把所有初始化操作放入 onCreate()


2、Camera被其他进程占用时,调用 Camera.open() 导致进程异常终止
解决办法就是用 try{...} Exception {...}
把一切异常都湮灭
关于摄像头,最近我的手机升级到了4.0.4 (Nexus S)之后,用原来的代码打开闪光灯的方法失灵了,原来的代码如下:
[java] view plaincopy
Camera c = Camera.open(); 
Camera.Parameters p = c.getParameters(); 
p.setFlashMode(Parameters.FLASH_MODE_TORCH); 
c.setParameters(p); 
c.startPreview(); 
[java] view plaincopy
Camera c = Camera.open();  
Camera.Parameters p = c.getParameters();  
p.setFlashMode(Parameters.FLASH_MODE_TORCH);  
c.setParameters(p);  
c.startPreview();  
在网上搜了一下,有人已经克服这个问题了,但是没人讲他们是怎么解决这个问题的。
我经过几番尝试,终于弄明白为什么以上代码在4.0以后系统无法打开闪光灯了:
从 API 11 开始, Camera 类的API有一些调整,需要把 Camera 所需的各项参数都设置好了才行,以上代码只设了一个
flash mode,缺了很多东西,所以打不开闪光灯。 以下代码是我在4.0系统上测试好了,可以打开闪光灯的代码:
[java] view plaincopy
Camera c = Camera.open(); 
Camera.Parameters p = c.getParameters(); 
List<Camera.Size> sizes = params.getSupportedPreviewSizes(); 
List<Integer> rates = params.getSupportedPreviewFrameRates(); 
p.setPreviewFrameRate(rates.get(0)); 
p.setPreviewSize(sizes.get(0).width, sizes.get(0).height); 
p.setFlashMode(Parameters.FLASH_MODE_TORCH); 
p.setFocusMode(Parameters.FOCUS_MODE_AUTO); 
c.setParameters(params); 
 
try { 
    if (  Build.VERSION.SDK_INT >= 11 ) { 
        c.setPreviewTexture(new SurfaceTexture(0)); 
    } 
    c.startPreview(); 

catch(IOException e) { 
    e.printStackTrace(); 

[java] view plaincopy
Camera c = Camera.open();  
Camera.Parameters p = c.getParameters();  
List<Camera.Size> sizes = params.getSupportedPreviewSizes();  
List<Integer> rates = params.getSupportedPreviewFrameRates();  
p.setPreviewFrameRate(rates.get(0));  
p.setPreviewSize(sizes.get(0).width, sizes.get(0).height);  
p.setFlashMode(Parameters.FLASH_MODE_TORCH);  
p.setFocusMode(Parameters.FOCUS_MODE_AUTO);  
c.setParameters(params);  
  
try {  
    if (  Build.VERSION.SDK_INT >= 11 ) {  
        c.setPreviewTexture(new SurfaceTexture(0));  
    }  
    c.startPreview();  
}  
catch(IOException e) {  
    e.printStackTrace();  
}  


 
3、如何在Service中更新App Widget:
典型代码如下:
AppWidgetManager mgr = AppWidgetManager.getInstance(this);
        int[] ids = mgr.getAppWidgetIds(new ComponentName(this, FlashlightWidgetProvider.class));
        for ( int id : ids ) {
            RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget_flashlight);
            操作views(把views看做App Widget)
            mgr.updateAppWidget(id, views);
        }
4、PopupWindow 如何设置动画
在 res/values 下新建一个xml文件,文件名任意,例如res/values/styles.xml,
创建一个style资源,例如:
<code><span class="tag"><style</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"AnimationPopup"</span><span class="tag">></span><span class="pln">
</span><span class="pun">    <</span><span class="pln">item name</span><span class="pun">=</span><span class="str">"@android:windowEnterAnimation"</span><span class="pun">>@</span><span class="pln">anim</span><span class="pun">/</span><span class="pln">popup_show</span><span class="pun"></</span><span class="pln">item</span><span class="pun">></span><span class="pln">
</span><span class="pun">    <</span><span class="pln">item name</span><span class="pun">=</span><span class="str">"@android:windowExitAnimation"</span><span class="pun">>@</span><span class="pln">anim</span><span class="pun">/</span><span class="pln">popup_hide</span><span class="pun"></</span><span class="pln">item</span><span class="pun">>
</span><span class="pln"></span><span class="tag"></style></span><span class="pln">
</span></code>
这个style资源应该包含两个item,一个用于出现,另一个用于消失。这两个item都是动画资源。
然后,调用 PopupWindow.setAnimationStyle(int),把R.style.AnimationPopup传进来即可。
 
5、PopupWindow.showXXX() 之后,窗口不显示
是因为没有设置PopupWindow的窗口大小,可以调用 PopupWindow.setWindowLayoutMode(WRAP_CONTENT, WRAP_CONTENT)
PopupWindow的窗口默认大小为0.
在Activity退出之前,应该主动调用 PopupWindow.dismiss(),否则会报告 window leak 异常。
6、如何实现开机自启动
Android系统每次启动的时候都会广播一个Intent,只要在自己的程序中创建一个BroadcastReceiver,
接收这个Intent,然后启动自己的服务即可。
例如,在AndroidManifest.xml 中定义receiver: 
<receiver android:name=".service.BootReceiver">
    <intent-filter>
    <!-- 系统启动完成后会调用-->
    <action android:name="android.intent.action.BOOT_COMPLETED">
    </action>
    </intent-filter>
< /receiver>
也可以动态注册这个receiver
需要权限: android.permission.RECEIVE_BOOT_COMPLETED
7、用 Resources.openRawResourceFd(int) 得到的文件描述符传给
MediaPlayer.setDataSource(FileDescriptor fd) 似乎不起作用,要用 MediaPlayer.setDataSource(FileDescriptor fd, long offset, long length)
才可以。
转自优快云
------------------------------------------------------
2014年10月16日
在研究Dialog的源码中发现,只要涉及到内部类比如Builder,那么在内部类中都会做对外部类对象的弱引用的封装。
内容概要:本文系统阐述了企业新闻发稿在生成式引擎优化(GEO)时代下的全渠道策略与效果评估体系,涵盖当前企业传播面临的预算、资源、内容与效果评估四大挑战,并深入分析2025年新闻发稿行业五大趋势,包括AI驱动的智能化转型、精准化传播、首发内容价值提升、内容资产化及数据可视化。文章重点解析央媒、地方官媒、综合门户和自媒体四类媒体资源的特性、传播优势与发稿策略,提出基于内容适配性、时间节奏、话题设计的策略制定方法,并构建涵盖品牌价值、销售转化与GEO优化的多维评估框架。此外,结合“传声港”工具实操指南,提供AI智能投放、效果监测、自媒体管理与舆情应对的全流程解决方案,并针对科技、消费、B2B、区域品牌四大行业推出定制化发稿方案。; 适合人群:企业市场/公关负责人、品牌传播管理者、数字营销从业者及中小企业决策者,具备一定媒体传播经验并希望提升发稿效率与ROI的专业人士。; 使用场景及目标:①制定科学的新闻发稿策略,实现从“流量思维”向“价值思维”转型;②构建央媒定调、门户扩散、自媒体互动的立体化传播矩阵;③利用AI工具实现精准投放与GEO优化,提升品牌在AI搜索中的权威性与可见性;④通过数据驱动评估体系量化品牌影响力与销售转化效果。; 阅读建议:建议结合文中提供的实操清单、案例分析与工具指南进行系统学习,重点关注媒体适配性策略与GEO评估指标,在实际发稿中分阶段试点“AI+全渠道”组合策略,并定期复盘优化,以实现品牌传播的长期复利效应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值