提出这个问题,主要是因为当使用avd创建emulator时,当把大屏模拟器(如WVGA800)density从240调低时,对于很多未做兼容性处理的程序,包括android系统某些自带程序,屏幕会出现此种情况:
更有意思的是,samsung大吹特吹的galaxy tab addon emulator不修改density也存在这个缺陷(它的默认分辨率是1024*600).
要根治这个问题,需要修改sdk中core包的内容,对于使用真机做调试的开发人员,这个问题不是问题,在源码中修改sdk后随系统编译到真机即可.而对于使用模拟器测试程序的人来说,无疑是非常头疼的事情,模拟器运行状态时,是不能通过file explorer覆盖core包的,我想到的解决办法是找到模拟器实例在硬盘的存放位置,替换组件后再启动模拟器.
找到avd存放模拟器实例的位置:C:\Documents and Settings\Administrator\.android\avd,发现模拟器实例只存放了sdcard.img,cache.img,userdata.img和userdata-qemu.img.由此推测所有的同一版本的模拟器是共用的同一个system.img,于是切到sdk安装目录,把system.img移走,果然原来建好的模拟器已运行不起来,报找不到system.img.
我从公司服务器拖一个system.img过来替换原来的,发现同样跑不起来,看来这个system.img还非解耦合文件.
这样,我们就需要保留system.img的其它内容,而只抽换我们修改的core.jar.
接下来需要做的是打开并修改system.img并重新打包system.img,具体方法见:
http://android-dls.com/wiki/index.php?title=HOWTO:_Unpack,_Edit,_and_Re-Pack_Boot_Images
如果要替换更多的sdk文件,按照上述步骤即可.
标记定义Widget的大小,默认布局和创建Widget实例时的启动行为配置,为了让Widget在主屏幕上更好地显示,Widget必须保持一定的大小,主屏幕分为特定大小的单元格,Google提供的基本原则是用你想占用的单元格数量乘以74,再减去2。
例:Widget应该是一个正方形,长和宽都各占两个单元格,因此大小就是74*2-2=146dp.
Activity,Service属于主线程,在主线程中才能更新UI,如toast等。其他线程中不能直接使用,这时可以使用Handler来处理,Handler可以在Activity和Service中。
其实平常一般都是使用AsyncTask的,而并非Thread和Handler去更新UI,这里说下它们到底有什么区别,我们平时应该使用哪种。从Android 1.5开始系统将AsyncTask引入到android.os包中,过去在很早1.1和1.0 SDK时其实官方将其命名为UserTask,其内部是JDK 1.5开始新增的concurrent库,做过J2EE的网友可能明白并发库效率和强大性,比Java原始的Thread更灵活和强大,但对于轻量级的使用更为占用系统资源。Thread是Java早期为实现多线程而设计的,比较简单不支持concurrent中很多特性在同步和线程池类中需要自己去实现很多的东西,对于分布式应用来说更需要自己写调度代码,而为了Android UI的刷新Google引入了Handler和Looper机制,它们均基于消息实现,有时可能消息队列阻塞或其他原因无法准确的使用。 推荐大家使用AsyncTask代替Thread+Handler的方式,不仅调用上更为简单,经过实测更可靠一些,Google在Browser中大量使用了异步任务作为处理耗时的I/O操作,比如下载文件、读写数据库等等,它们在本质上都离不开消息,但是AsyncTask相比Thread加Handler更为可靠,更易于维护,但AsyncTask缺点也是有的比如一旦线程开启即dobackground方法执行后无法给线程发送消息,仅能通过预先设置好的标记来控制逻辑,当然可以通过线程的挂起等待标志位的改变来通讯,对于某些应用Thread和Handler以及Looper可能更灵活。 那么先让我们看看要使用AsyncTask 类首先要做哪些工作? 1) 子类化AsyncTask 2) 实现AsyncTask中定义的下面一个或几个方法 onPreExecute() 开始执行前的准备工作; doInBackground(Params...) 开始执行后台处理,可以调用publishProgress方法来更新实时的任务进度; onProgressUpdate(Progress...) 在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。 onPostExecute(Result) 执行完成后的操作,传送结果给UI 线程。 这4个方法都不能手动调用。而且除了doInBackground(Params...)方法,其余3个方法都是被UI线程所调用的,所以要求: 1) AsyncTask的实例必须在UI thread中创建; 2) AsyncTask.execute方法必须在UI thread中调用; 同时要注意:该task只能被执行一次,否则多次调用时将会出现异常。而且是不能手动停止的,这一点要注意,看是否符合你的需求! 在使用过程中,发现AsyncTask的构造函数的参数设置需要看明白:AsyncTask<Params, Progress, Result> Params对应doInBackground(Params...)的参数类型。而new AsyncTask().execute(Params... params),就是传进来的Params数据,你可以execute(data)来传送一个数据,或者execute(data1, data2, data3)这样多个数据。 Progress对应onProgressUpdate(Progress...)的参数类型; Result对应onPostExecute(Result)的参数类型。 当以上的参数类型都不需要指明某个时,则使用Void,注意不是void。 说到这里就得多说几句 你看AsyncTask 你就会发现这个类是个泛型类 这个类是这样定义的。
摘自:http://mypyg.iteye.com/blog/722449
WindowManager m = getWindowManager(); Display d = m.getDefaultDisplay(); //为获取屏幕宽、高 LayoutParams p = getWindow().getAttributes(); //获取对话框当前的参数值 p.height = (int) (d.getHeight() * 0.6); //高度设置为屏幕的0.6 p.width = (int) (d.getWidth() * 0.95); //宽度设置为屏幕的0.95 getWindow().setAttributes(p); //设置生效
// System.exit(0);//service will be killed // android.os.Process.killProcess(android.os.Process.myPid());//>> // finish();
android launchmode小结 br /launchmode4种模式:br / 1,standard:br / 如果从A跳到A,intent5次,task里5个activity;br / 2,single Top:br / 如果从A 跳B,再从B跳A,如果此时栈顶为A,则不创建新实例,直接把Intent给A,但如果栈顶不是A,则还要创建A的实例br / 3,singleTaskbr / 如果从A跳B,再从B跳A,无论是否栈顶栈底,只要A在,则将Intent给A,不会创建A的新实例;br / 4,singleInstancebr / 不同于前3种模式,前3种只是在同一个task的,而实例化的策略不同。这种模式下的activity会单独存在一个task下。br / 现成的例子是google地图。比如我有一个应用是导游方面的,其中调用的google地图Activity。那么现在我比如按home(后台 activity onstop,back是finish)键,然后到应用列表中打开google地图,你会发现显示的就是刚才的地图,实际上是同一个Activity。
摘自:http://www.cnblogs.com/wfh1988/archive/2011/01/28/1947045.html
一个APK启动别一个APK的Activity 1、要被启动的那个Apk的manifest.xml的Activity中: <activity android:name="MyActivity"> <intent-filter> <action android:name="devdiv.intent.action.MyActivity"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> <activity> 2、另一个要主动启动的Activity: Intent intent = new Intent("devdiv.intent.action.MyActivity") ; startActivity(intent);
最近在研究两个界面间的动画,用ViewFlipper倒是可以实现view间手指滑动的切换效果,但是不能实现拖动的效果,貌似重写ViewFlipper也不行,继续研究吧,Express News实现的非常好.到底是用什么方式实现的呢? google过程中发现这样一个方法,可以非常方便的实现两个activity间的动画,不过遗憾的是只有android2.0版本以上才支持这个方法.记录如下: Intent intentimage = new Intent(); intentimage.setClass(Now.this, NewsImage.class); startActivityForResult(intentimage, 250); overridePendingTransition(R.anim.push_up_in, R.anim.push_up_out);