当前位置: 编程技术>移动开发
本页文章导读:
▪在SurfaceView下画图的片段 在SurfaceView上画图的片段
mPaint = new Paint(); mPaint.setColor(Color.RED);// 画笔为绿色 mPaint.setStrokeWidth(2); // 设置画笔粗细 byte[] buffer = new byte[300]; t.........
▪ froyo系统原生bug及匡正:改变系统语言时Launcher2的AllApps内shortcut不刷新[转载] froyo系统原生bug及修正:改变系统语言时Launcher2的AllApps内shortcut不刷新[转载]
原文把froyo的Launcher2移植到eclair后,产生了一些小问题,都一一解决掉了.这是市场反馈回来的一个问题之一,摸清内.........
▪ 智能手机下的第一桶金:移动学习 智能手机上的第一桶金:移动学习
重大技术创新正在影响和将要影响我们生活、工作的点点滴滴,同时涌现的巨大财富也会造就一批新的主人。
互联网的造富运动刚刚落下,移动互联网的.........
[1]在SurfaceView下画图的片段
来源: 互联网 发布时间: 2014-02-18
在SurfaceView上画图的片段
mPaint = new Paint();
mPaint.setColor(Color.RED);// 画笔为绿色
mPaint.setStrokeWidth(2); // 设置画笔粗细
byte[] buffer = new byte[300];
try {
File f = new File("/sdcard/xiangshuibaihe.mp3");
FileInputStream input;
input = new FileInputStream(f);
BufferedInputStream inBuff=new BufferedInputStream(input);
while(inBuff.read(buffer) != -1 && showYN==1)
{
//sleep(1000);
Canvas canvas = mysv.getHolder().lockCanvas(
new Rect(0, 0, 0 + buffer.length, mysv.getHeight()));// 关键:获取画布
canvas.drawColor(Color.BLACK);// 清除背景
for(int i=0; i<buffer.length; i++)
{
int y = buffer[i];
int x = i;
canvas.drawLine(x, 0, x, y, mPaint);
}
mysv.getHolder().unlockCanvasAndPost(canvas);// 解锁画布,提交画好的图像
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} */
mPaint = new Paint();
mPaint.setColor(Color.RED);// 画笔为绿色
mPaint.setStrokeWidth(2); // 设置画笔粗细
byte[] buffer = new byte[300];
try {
File f = new File("/sdcard/xiangshuibaihe.mp3");
FileInputStream input;
input = new FileInputStream(f);
BufferedInputStream inBuff=new BufferedInputStream(input);
while(inBuff.read(buffer) != -1 && showYN==1)
{
//sleep(1000);
Canvas canvas = mysv.getHolder().lockCanvas(
new Rect(0, 0, 0 + buffer.length, mysv.getHeight()));// 关键:获取画布
canvas.drawColor(Color.BLACK);// 清除背景
for(int i=0; i<buffer.length; i++)
{
int y = buffer[i];
int x = i;
canvas.drawLine(x, 0, x, y, mPaint);
}
mysv.getHolder().unlockCanvasAndPost(canvas);// 解锁画布,提交画好的图像
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} */
[2] froyo系统原生bug及匡正:改变系统语言时Launcher2的AllApps内shortcut不刷新[转载]
来源: 互联网 发布时间: 2014-02-18
froyo系统原生bug及修正:改变系统语言时Launcher2的AllApps内shortcut不刷新[转载]
原文
把froyo的Launcher2移植到eclair后,产生了一些小问题,都一一解决掉了.这是市场反馈回来的一个问题之一,摸清内部机制颇废了一番周折.也算见识了android系统内部的另一个面向切面编程案例,很有必要记录一下,有时间好好研究研究,可以借此做些特殊的系统功能.
严格意义上说,这并不是跨版本移植产生的问题,而是系统原生的一个bug,用samsung的galaxy tab平板模拟器测试同样是此现象:当在Launcher里面启动Settings,改变语言设置后,再回到Launcher,AllApps2D里面的shortcuts文字部分并不随之更新,还是保持原样.其它部分却已更新.
察看Settings源码可以知道,设置语言,改变的只是执行了如下代码:
Java代码
try {
IActivityManager am = ActivityManagerNative.getDefault();
Configuration config = am.getConfiguration();
Loc loc = mLocales[position];
config.locale = loc.locale;
// indicate this isn't some passing default - the user wants this remembered
config.userSetLocale = true;
am.updateConfiguration(config);
// Trigger the dirty bit for the Settings Provider.
BackupManager.dataChanged("com.android.providers.settings");
} catch (RemoteException e) {
// Intentionally left blank
}
finish();
在configuration改变后,系统会让每一个切换到前台的Activity destroy,然后重新加载至原位置,非常奇妙的刷新操作,有时间要看看他如何保存当前状态的代码,比如,当前切换到前台的Activity是launcher,则会一直加载到allapps2d打开,而不是oncreate完成后的初始位置.对于状态机学习来说,Launcher无疑是很好的教科书.
然而,configuration的控制范围只是所有的Activity,Activity实现了一个接口ComponentCallbacks,里面有:
Java代码
/**
* Called by the system when the device configuration changes while your
* activity is running. Note that this will <em>only</em> be called if
* you have selected configurations you would like to handle with the
* {@link android.R.attr#configChanges} attribute in your manifest. If
* any configuration change occurs that is not selected to be reported
* by that attribute, then instead of reporting it the system will stop
* and restart the activity (to have it launched with the new
* configuration).
*
* <p>At the time that this function has been called, your Resources
* object will have been updated to return resource values matching the
* new configuration.
*
* @param newConfig The new device configuration.
*/
public void onConfigurationChanged(Configuration newConfig) {
mCalled = true;
if (mWindow != null) {
// Pass the configuration changed event to the window
mWindow.onConfigurationChanged(newConfig);
}
}
而对于Launcher来说,allapps里面的内容是通过LauncherModel.java里面的线程类去异步加载的,重启Launcher这个Activity,并不会让LauncherModel里面的缓存的allapps内容刷新,Launcher是直接拿了LauncherModel里面缓存的query数据而不是通知loader线程重新获取,问题就出在这里了.
解决的方法并不复杂,Launcher在调onCreate()的时候,会调用checkForLocaleChange()方法检查是否语言设置是否被修改,我们定义一个boolean类变量,把语言设置是否改变存到里面,然后为LauncherModel重构一个startLoader方法,在onCreat()代码的相应位置调用此重构方法,把状态值传进去.在内部类Loader的loadAndBindAllApps()方法里,增加判断条件让语言改变时走loadAllAppsByBatch()路线即可.
我们来看看可以从中学到些什么?
1\定义和使用configuration的类变量,可以很好的传递任何全局数据,可以和硬件方便的通信.
2\利用configuration控制framework各模块ui.一个简单例子,在launcher中,利用语言设置变化,显示或隐藏不同语言环境的应用,比如面向国内市场的机器,youtube反正用不上,就可以隐藏掉.加上youku.平板电脑没有phone功能的,把phone的shortcut给拿掉.
3\另一个想法,能否利用configuration绕过系统权限实现截屏等需要root权限的功能?
原文
把froyo的Launcher2移植到eclair后,产生了一些小问题,都一一解决掉了.这是市场反馈回来的一个问题之一,摸清内部机制颇废了一番周折.也算见识了android系统内部的另一个面向切面编程案例,很有必要记录一下,有时间好好研究研究,可以借此做些特殊的系统功能.
严格意义上说,这并不是跨版本移植产生的问题,而是系统原生的一个bug,用samsung的galaxy tab平板模拟器测试同样是此现象:当在Launcher里面启动Settings,改变语言设置后,再回到Launcher,AllApps2D里面的shortcuts文字部分并不随之更新,还是保持原样.其它部分却已更新.
察看Settings源码可以知道,设置语言,改变的只是执行了如下代码:
Java代码
try {
IActivityManager am = ActivityManagerNative.getDefault();
Configuration config = am.getConfiguration();
Loc loc = mLocales[position];
config.locale = loc.locale;
// indicate this isn't some passing default - the user wants this remembered
config.userSetLocale = true;
am.updateConfiguration(config);
// Trigger the dirty bit for the Settings Provider.
BackupManager.dataChanged("com.android.providers.settings");
} catch (RemoteException e) {
// Intentionally left blank
}
finish();
在configuration改变后,系统会让每一个切换到前台的Activity destroy,然后重新加载至原位置,非常奇妙的刷新操作,有时间要看看他如何保存当前状态的代码,比如,当前切换到前台的Activity是launcher,则会一直加载到allapps2d打开,而不是oncreate完成后的初始位置.对于状态机学习来说,Launcher无疑是很好的教科书.
然而,configuration的控制范围只是所有的Activity,Activity实现了一个接口ComponentCallbacks,里面有:
Java代码
/**
* Called by the system when the device configuration changes while your
* activity is running. Note that this will <em>only</em> be called if
* you have selected configurations you would like to handle with the
* {@link android.R.attr#configChanges} attribute in your manifest. If
* any configuration change occurs that is not selected to be reported
* by that attribute, then instead of reporting it the system will stop
* and restart the activity (to have it launched with the new
* configuration).
*
* <p>At the time that this function has been called, your Resources
* object will have been updated to return resource values matching the
* new configuration.
*
* @param newConfig The new device configuration.
*/
public void onConfigurationChanged(Configuration newConfig) {
mCalled = true;
if (mWindow != null) {
// Pass the configuration changed event to the window
mWindow.onConfigurationChanged(newConfig);
}
}
而对于Launcher来说,allapps里面的内容是通过LauncherModel.java里面的线程类去异步加载的,重启Launcher这个Activity,并不会让LauncherModel里面的缓存的allapps内容刷新,Launcher是直接拿了LauncherModel里面缓存的query数据而不是通知loader线程重新获取,问题就出在这里了.
解决的方法并不复杂,Launcher在调onCreate()的时候,会调用checkForLocaleChange()方法检查是否语言设置是否被修改,我们定义一个boolean类变量,把语言设置是否改变存到里面,然后为LauncherModel重构一个startLoader方法,在onCreat()代码的相应位置调用此重构方法,把状态值传进去.在内部类Loader的loadAndBindAllApps()方法里,增加判断条件让语言改变时走loadAllAppsByBatch()路线即可.
我们来看看可以从中学到些什么?
1\定义和使用configuration的类变量,可以很好的传递任何全局数据,可以和硬件方便的通信.
2\利用configuration控制framework各模块ui.一个简单例子,在launcher中,利用语言设置变化,显示或隐藏不同语言环境的应用,比如面向国内市场的机器,youtube反正用不上,就可以隐藏掉.加上youku.平板电脑没有phone功能的,把phone的shortcut给拿掉.
3\另一个想法,能否利用configuration绕过系统权限实现截屏等需要root权限的功能?
[3] 智能手机下的第一桶金:移动学习
来源: 互联网 发布时间: 2014-02-18
智能手机上的第一桶金:移动学习
重大技术创新正在影响和将要影响我们生活、工作的点点滴滴,同时涌现的巨大财富也会造就一批新的主人。
互联网的造富运动刚刚落下,移动互联网的机会马上就要开始。机不可失,失不再来。在产业的躁动中,你的机会在哪里?
移动时代已经拉开序幕
我说的移动互联网,主要是指以手机为上网终端的相关产业。手机上网,从WAP时代就开始酝酿,一直是光见打雷不见下雨。直到苹果公司推出IPhone以及Appstore,才算让人看到希望。
于是乎,各个有追求的国内外相关公司都推出了自己的Appstore。不怕搭错车,就怕跟不上。国外的有谷歌、诺基亚、三星,国内的有中国移动、联通、联想。其中最卖力的是联想,还虔诚的复制了乐phone和乐pad。
在言必称“移动互联网”的今天,却没有几个人能把移动互联网说的清楚。大家判断的依据主要有这两么两点:第一是手机用户在绝对数量和增长速度远远超过PC的时候,一个新的商业时代到来了。最近微软宣布背弃WinTel联盟,下一代Windows操作系统将运行在“一切设备”上,包括采用了英特尔竞争对手ARM芯片的平板电脑。
业界普遍认为这是PC时代谢幕的尾声。微软曾经在Intel的压力下放弃对ARM的win7支持。芯片产业的人都知道ARM是嵌入式芯片的领头羊,ARM的低功耗不是Intel这样的对手一天两天能够赶上的。
移动时代已经悄然到来,可是很多人还没有准备好。
看,谁已经在悄然布局
在致员工的元旦贺词里,华为公司披露了手机类终端的战绩。
其中2010年华为终端全球发货量为1.2亿台。2010年华为终端全球销售收入突破45亿美元,再创历史高峰。在家庭融合终端方面,华为多年来就是全球第一。2010年,华为融合终端量订货同比增长超过50%;在融合终端市场持续保持全球份额第一。其中,机顶盒实现了300%快速增长,平板电脑产品也大量进入欧美高端市场。
这些终端的业绩,只是华为云计算全业务布局“云、管、端”的一端。在华为眼里,云计算简单说就是业务的IT云,超宽带的IP网络和终端的智能化。
业务的IT化,就是以七号信令为代表的语音业务为主体被以Web为代表的数据业务替代。数据业务代替语音业务,同时也带来了网络通道的IP化、网络的宽带化、超宽带。
终端分为和人打交道的终能终端和不与人打交道的物理终端。
更多的国外IT巨头更多发力在云端。比如IBM的智慧地球、微软的“云计算”、Google的企业在线应用等等。写到这里,大家应该明白为何华为提出IBM、Google是自己的竞争对手了。
如果我们只关注与人打交道的智能手机,那么云计算就有另外一个我们熟悉的名字:移动互联网。
第一桶金:移动学习
云计算,就像信息高速公路,强调的更多是基础设施。移动互联网就像公路上跑的汽车,更关注具体应用。
Appstore,顾名思义,就是这些具体应用的终端大集市。大家都看好集市,认为是个制高点,一窝蜂去建集市了。可是集市平台不会太多,做买卖的应该才是主流。
从应用的角度来看,我认为移动学习可能将是移动互联网爆发的切入点。“互联网应用的第三次浪潮是E-Learning。”对网络学习狂热的思科总裁约翰•钱伯斯曾如此断言。
移动学习的如下特点,决定了其在移动互联网领域的爆发潜力。
第一是碎片化。快速的生活和工作节奏,导致用户学习行为主要以零散时间为主。
第二是个性化。每个人的知识背景、兴趣点、学习重点都不尽相同,从而造成每个人的学习路径也不一样。这种个性化的要求是学习者的自然需求。
第三是移动化。据说90%的人不喜欢学习,所以用户对学习服务的体验是很苛刻的。学习产品除了要照顾用户学习内容的需求,同时还是照顾用户学习的用户体验。根据不同终端对学习体验进行优化,是移动学习的一个关键要求。
一切的背后最重要的原因是,现代的商业激烈竞争要求我们不断的学习充电,不然等待我们的只有被淘汰的命运。
而移动学习,是我们完成充电的最好帮手。Appstore上除了游戏,最多的就是学习类应用。这或许就是暗示我们创业者向那个方向努力的一个强烈信号。
来源:新浪博客
最新技术文章: