一、【线程相关】Can't create handler inside thread that has not called Looper.prepare()
Cause Reason:通常是在非主线程中执行了与UI相关的操作。例子如下:
/**
* @author heg
* @version 创建时间:2014-3-12 上午9:53:03
* @description:
* 验证对话框能否从Service中弹出,不需要Activity?<br>
*
*/
public class DialogShowFromService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// show();
showDialog();
return super.onStartCommand(intent, flags, startId);
}
private void showDialog() {
new Thread(new Runnable(){
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
show();
}
}).start();
}
private void show() {
AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
builder.setTitle("从Service弹出来!");
builder.create().show();
}
}
二、【Context相关】Unable to add window -- token null is not for an application
Cause Reason:通常是在错误的上下文中创建View,如在Service中直接添加UI组件就不行。例子如下:
/**
* @author heg
* @version 创建时间:2014-3-12 上午9:53:03
* @description:
* 验证对话框能否从Service中弹出,不需要Activity?<br>
*
*/
public class DialogShowFromService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
show();
// showDialog();
return super.onStartCommand(intent, flags, startId);
}
private void show() {
AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
builder.setTitle("从Service弹出来!");
builder.create().show();
}
}
Ps: 上面例子的结论是:
/*<p>结论:<br>
* Service中可以不需要Activity弹出对话框,<br>
* 但只能弹出系统级对话框,并且需要以下两个条件:
* <br>dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)
* <br>"android.permission.SYSTEM_ALERT_WINDOW"*/
三、【编译相关】如何编译第三方jar包。
#先指定库名,可以自己定义。多个有多个需要 libName1 \ libName2 这样
LOCAL_STATIC_JAVA_LIBRARIES := libName
#预编译静态库
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libName:libPath/libRealName
#不加上下一句会报need by /classes-full-debug.jar等错误
include $(BUILD_MULTI_PREBUILT)