刚才帮同看问题,同说调用renameTo 文件没有被重命名,看了一下原来问题出在这里
/** * @(#) Test.java Created on 2012-6-4 * * Copyright (c) 2012 Aspire. All Rights Reserved */ package com.and.test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; /** * The class <code>Test</code> * * @author Administrator * @version 1.0 */ public class Test { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // 源文件 final File src = new File("f:\\", "a.log"); // 目标文件 final File dest = new File("f:\\", "b.log"); // 如果文件有人在读取它,则不能被重命名 final InputStream in = new FileInputStream(dest); final boolean con = src.renameTo(dest); if (con) { System.out.println("success"); } else { System.out.println("fail"); } } }
也就是说,源文件在被重命名之前 ,不能有人在读取它,但是java为什么不提供个异常???
最近开发安卓应用时,要提供一个定时关机的功能,结果使用
finish()
或者android.os.Process.killProcess(android.os.Process.myPid())
都不行,都只能关闭调用的那个activity,而我如果打开了多个activity,则无法完全退出应用。
网上找了一些资料说System.exit(0)方法同以上的两个方法一样,也达不到效果。
相关资料:
http://maxuefeng.blog.51cto.com/1876326/528561
http://www.360doc.com/content/11/0610/17/128678_126052257.shtml
这些资料中另外都介绍了一种方法:
ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE); manager.restartPackage(getPackageName());
并声明权限:
<uses-permission android:name="android.permission.RESTART_PACKAGES"/>
这种方法确实可以达到完全退出程序的目的,但是退得太彻底了,要慎重使用。
因为该方法会终止一切和这个程序包关联的,所有共享同一uid的process被kill,所有的activity会被removed所有创建的服务会停止,还会发一个广播 Intent.ACTION_PACKAGE_RESTARTED 导致所有注册alarms被stopped,
notifications被removed。
如果你的程序使用了Alarm,则不能使用该方法。此外,该方法只能使用在1.5-2.2(不含)版本的系统中,2.2之后的需使用ActivityManager的am.killBackgroundProcesses()方法来达到目的。
由于以上方法均不能满足我的目的,因此我自己另外想了一种解决方法:
1、声明一个Activity基类,让所有Activity继承该基类;
2、在该基类中定义一个BroadcaseReceiver,在onReceiv()方法中调用Activity的finish()方法结束Activity;
3、在该基类的onCreate()方法中注册该BroadcaseReceiver,并在onDestroy()方法中取消注册;
4、在需要退出程序的地方发送一个由以上BroadcaseReceiver处理的广播。
这样,当BroadcaseReceiver接受到该广播后,finish()方法便会把所有的Activity结束掉,从而达到退出应用的目的;与此同时,并不会影响注册的Alarms等功能。
错误如下:
06-15 04:33:34.789: W/dalvikvm(2924): threadid=14: thread exiting with uncaught exception (group=0x40a791f8)
06-15 04:33:34.789: E/AndroidRuntime(2924): FATAL EXCEPTION: ComposeHandler
06-15 04:33:34.789: E/AndroidRuntime(2924): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
06-15 04:33:34.789: E/AndroidRuntime(2924): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4109)
06-15 04:33:34.789: E/AndroidRuntime(2924): at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:709)
06-15 04:33:34.789: E/AndroidRuntime(2924): at android.view.View.requestLayout(View.java:12710)
06-15 04:33:34.789: E/AndroidRuntime(2924): at android.view.View.requestLayout(View.java:12710)
06-15 04:33:34.789: E/AndroidRuntime(2924): at android.view.View.requestLayout(View.java:12710)
06-15 04:33:34.789: E/AndroidRuntime(2924): at android.view.View.requestLayout(View.java:12710)
06-15 04:33:34.789: E/AndroidRuntime(2924): at android.view.View.requestLayout(View.java:12710)
06-15 04:33:34.789: E/AndroidRuntime(2924): at android.view.View.requestLayout(View.java:12710)
06-15 04:33:34.789: E/AndroidRuntime(2924): at android.view.View.requestLayout(View.java:12710)
06-15 04:33:34.789: E/AndroidRuntime(2924): at android.view.View.requestLayout(View.java:12710)
06-15 04:33:34.789: E/AndroidRuntime(2924): at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:268)
06-15 04:33:34.789: E/AndroidRuntime(2924): at android.view.View.requestLayout(View.java:12710)
06-15 04:33:34.789: E/AndroidRuntime(2924): at android.view.View.setFlags(View.java:6728)
06-15 04:33:34.789: E/AndroidRuntime(2924): at android.view.View.setVisibility(View.java:4625)
06-15 04:33:34.789: E/AndroidRuntime(2924): at com.android.mms.ui.ComposeMessageActivity.updateTypingIcon(ComposeMessageActivity.java:8182)
06-15 04:33:34.789: E/AndroidRuntime(2924): at com.android.mms.ui.ComposeMessageActivity.access$9700(ComposeMessageActivity.java:257)
06-15 04:33:34.789: E/AndroidRuntime(2924): at com.android.mms.ui.ComposeMessageActivity$ComposeEventHdlr.handleMessage(ComposeMessageActivity.java:8619)
06-15 04:33:34.789: E/AndroidRuntime(2924): at android.os.Handler.dispatchMessage(Handler.java:99)
06-15 04:33:34.789: E/AndroidRuntime(2924): at android.os.Looper.loop(Looper.java:137)
06-15 04:33:34.789: E/AndroidRuntime(2924): at android.os.HandlerThread.run(HandlerThread.java:60)
06-15 04:33:34.820: W/ActivityManager(224): Force finishing activity com.android.mms/.ui.ComposeMessageActivity
修改方法:
将更新UI代码加入到activity的UI线程队列中
/*<Hap5.2 Message+ kf55773 2012-06-15 begin */
private void updateTypingIcon(final boolean aEnableTyping) {
ComposeMessageActivity.this.runOnUiThread(new Runnable() {
public void run() {
if (null == mTypingIcon) {
/* modified by Message+ kf36922 20120207 begin */
mTypingIcon = (GifView) findViewById(R.id.typing);
/* modified by Message+ kf36922 20120207 end */
}
if (aEnableTyping) {
mTypingIcon.setVisibility(View.VISIBLE);
} else {
mTypingIcon.setVisibility(View.GONE);
}
}
});
}
/*<Hap5.2 Message+ kf55773 2012-06-15 end */