android中activity无法启动的原因小结

android中activity无法启动的原因有很多,今日列出一些常见的问题和解决方法,供大家参考

1.未在AndroidManifest.xm文件中注册相应的activity

解决方法:在manifest文件的application节点下添加一个activity标签,注意android:name=“类名”中的类名一定不要拼错了

android中activity无法启动的原因小结_第1张图片

2.在主线程中进行了联网(如http请求,socket连接等)操作

解决方法a.加上图中被注释掉的两条语句:

StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

解决方法b.创建一个子线程,将联网操作放到该线程中

android中activity无法启动的原因小结_第2张图片


在子线程中进行联网操作的代码:

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;
	
	@Override
	protected 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(){
			@Override
			public void handleMessage(Message message){
				switch(message.what){
				case 0:
					textViewSourceCode.setText(text);
					break;
				default:
					break;
				}
				
			}
			
		};
		
				
				
        
		buttonSubmit.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				
				new Thread(new Runnable(){
					@Override
					public void run() {
						// TODO Auto-generated method stub	
						path = 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中activity无法启动的原因小结_第3张图片

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中activity无法启动的原因小结)