最近作了一个项目,其中有个视频和图片须要添加各类水印(日期,地点,经纬度,用户ID,产品ID等)问题,并且水印还要支持中英文自动切换显示。功能设计和实现算是比较顺利。昨天测试部给了一个小Bug,那就是在英文环境下,视频预览界面水印能正常显示英文,但经过拍照所得到的图片上的水印却显示为中文!而添加水印这一块代码是彻底同样的啊?问题出在哪呢?android
通过反复测试,没有发现代码有明显问题。因而凭直觉,就想难道是context上下文不一样有关?因而检查代码发现context确实不一样,在Activity View下的Context下,水印英文是能够自动切换过去的,而在Application的Context下水印只能显示中文!那么这两个context究竟有何不一样呢?app
注意事项:使用context的时候,当心内存泄露,防止内存泄露!
1. 不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity自己生命周期是同样的 ;
2. 对于生命周期长的对象,能够使用application context;
3. 避免非静态的内部类,尽可能使用静态类,避免生命周期问题,注意内部类对外部对象引用致使的生命周期变化。函数
2. 将包含相同name字段的英文内容的string.xml放入values-en目录下便可。通常状况下,系统会根据当前上下文自动切换调用相关的字段内容显示,即中文环境调用默认的values目录下的string.xml,英文环境会调用values-en目录下的stirng.xml,实现自动切换效果。测试
3. 手动显式的调用以下函数切换(本人还没有测试,仅供参考):spa
public void updateLanguage(Locale locale)
{
try
{
Object objIActMag;
Class<?> clzIActMag = Class.forName("android.app.IActivityManager");
Class<?> clzActMagNative = Class.forName("android.app.ActivityManagerNative");
Method mtdActMagNative$getDefault = clzActMagNative.getDeclaredMethod("getDefault");
objIActMag = mtdActMagNative$getDefault.invoke(clzActMagNative);
Method mtdIActMag$getConfiguration = clzIActMag.getDeclaredMethod("getConfiguration");
Configuration config = (Configuration) mtdIActMag$getConfiguration.invoke(objIActMag);
config.locale = locale;
Class[] clzParams = { Configuration.class };
Method mtdIActMag$updateConfiguration = clzIActMag.getDeclaredMethod("updateConfiguration", clzParams);
mtdIActMag$updateConfiguration.invoke(objIActMag, config);
} catch (Exception e) {
e.printStackTrace();
}.net
}翻译
而后,调用它进行切换:设计
com.android.internal.app.LocalePicker.updateLocale(Locale.ENGLISH );视频