android中activity无法启动的原因小结
android中activity无法启动的原因有很多,今日列出一些常见的问题和解决方法,供大家参考
1.未在AndroidManifest.xm文件中注册相应的activity
解决方法:在manifest文件的application节点下添加一个activity标签,注意android:name=“类名”中的类名一定不要拼错了
2.在主线程中进行了联网(如http请求,socket连接等)操作
解决方法a.加上图中被注释掉的两条语句:
StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
解决方法b.创建一个子线程,将联网操作放到该线程中
在子线程中进行联网操作的代码:
import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.os.StrictMode;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;public class ViewSourceCodeActivity extends Activity {private Button buttonSubmit;private EditText editTextPath;private TextView textViewSourceCode;private String text;private String path;private Handler handler;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_view_source_code);buttonSubmit = (Button)findViewById(R.id.buttnSubmit2);editTextPath = (EditText)findViewById(R.id.editTextPath);textViewSourceCode = (TextView)findViewById(R.id.textViewSourceCode); //StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build(); //StrictMode.setThreadPolicy(policy);handler = new Handler(){@Overridepublic void handleMessage(Message message){switch(message.what){case 0:textViewSourceCode.setText(text);break;default:break;}}}; buttonSubmit.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubnew Thread(new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stubpath = editTextPath.getText().toString();if(path.equals("")){//Toast.makeText(ViewSourceCodeActivity.this, "the path is empty", Toast.LENGTH_SHORT).show();}else{try{URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection)url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(5000);if(conn.getResponseCode() == 200) {InputStream is = conn.getInputStream(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len=0 ; while((len = is.read(buffer))!=-1){ bos.write(buffer, 0, len); } text =bos.toString(); bos.close(); is.close(); Message message = new Message();message.what = 0;handler.sendMessage(message); //textViewSourceCode.setText(text);}else{//Toast.makeText(ViewSourceCodeActivity.this, "response code error:" + conn.getResponseCode(), Toast.LENGTH_SHORT).show();}}catch(Exception e){if(e instanceof MalformedURLException){//Toast.makeText(ViewSourceCodeActivity.this, "MalformedURLException", Toast.LENGTH_SHORT).show();}else if(e instanceof IOException){////Toast.makeText(ViewSourceCodeActivity.this, "IOException", Toast.LENGTH_SHORT).show();}else{//Toast.makeText(ViewSourceCodeActivity.this, e.toString(), Toast.LENGTH_SHORT).show();}}}}}).start();}});}}
3.在子线程中更新了UI
Android推荐在UI线程中更新UI,以免出现同步的问题,如果在子线程更新UI(如Toast.makeText(), View类的setText()等)可能导致程序崩溃。
解决方法:在子线程中进行一些必要的数据处理,然后将处理结果利用message传递到UI线程中的handler,让handler来更新UI(具体可参考上面的
ViewSourceCodeActivity类。
4.调用了需要申请相关权限的函数而未在androidmanifest文件中申请相关权限
最常见的例子就是进行联网操作时没有申请android.permission.INTERNET权限
解决方法:只需在manifest文件中添加相应的权限声明即可,如:
android中常见的一些权限如下所示:
ACCESS_NETWORK_STATE 网络状态权限
ACCESS_WIFI_STATE WIFI网络状态信息权限
BATTERY_STATE 电池状态权限
BLUETOOTH 连接匹配的蓝牙设备权限
BLUETOOTH_ADMIN 发现匹配的蓝牙设备权限
BROADCAST_SMS 广播收到短信提醒的权限
CALL_PHONE 拨打电话的权限
CAMERA 使用相机的权限
CHANGE_NETWORK_STATE 改变网络状态权限
CHANGE_WIFI_STATE 改变wifi网络状态权限
DELETE_CACHE_FILES 允许删除缓存文件权限
DELETE_PACKAGES 允许删除安装包的权限
FLASHLIGHT 访问闪光灯的权限
INTERNET 允许访问网络的权限
MODIFY_AUDIO_SETTINGS 允许修改全局声音的权限
PROCESS_OUTGOING_CALLS 允许监听、控制、取消呼出电话的权限
READ_CONTACTS 允许读取电话薄的权限
READ_HISTORY_BOOKMARKS 读取浏览器收藏夹和历史记录的权限
READ_OWNER_DATA 允许读取用户数据的权限
READ_PHONE_STATE 允许读取手机状态的权限
READ_PHONE_SMS 允许读取短信息的权限
REBOOT 允许重启系统的权限
RECEIVE_MMS 允许处理、监控、接受彩信的权限
RECEIVE_SMS 允许处理、监控、接受短信的权限
RECORD_AUDIO 允许录音的权限
SEND_SMS 允许发送短信的权限
SET_ORIENTATION 设置屏幕方向权限
SET_TIME 设置时间权限
SET_TIME_ZONE 允许设置时区的权限
SET_WALLPAPER 设置桌面壁纸权限
VIBRATE 允许控制振动器的权限
WRITE_CONTACTS 允许写用户联系人的权限
WRITE_HISTORY_BOOKMARKS 允许应用程序写历史记录和书签的全新
WRITE_OWNER_DATA 允许应用程序写用户数据的权限
WRITE_SMS 允许写短信的权限
更多相关文章
- Android开发资料:Android启动优化解析
- Android(安卓)IntentService的使用与源码解析
- 详解Android(安卓)中AsyncTask 的使用
- 怎样在android中添加背景图片?
- Android应用程序入口和出口(sundy深入浅出)之进程和线程
- 每个Android开发者必须知道的资源集锦
- android 面试相关资料
- Android线程阻塞处理及优化
- Android(安卓)MP3录音实现