romact.apk的总结

这只是一个很小的应用,先上需求吧。


逻辑:
1.激活不是强制的:不激活也能用,只是每次显示设置时候提示督促激活的对话框。
激活不是自动的:比如人为操作来激活。
2.是否已经激活的标记
通过在用户数据区域保存特定变量来实现。数据不能保存在应用本身的数据区域,因为其他应用也要读取这个数据,比如设置。
当用户通过recovery等其他工具将用户数据区域清空,或者恢复出厂设置的话,又变回未激活状态。
minzuos_activated: "0"/"1",字符串
  "0":系统还未激活,如果变量不存在,那么也算是未激活。
  "1":系统已经激活。
minzuos_datetime: 整数的字符串形式,"1434088755",以秒为单位的时间戳,UNIX时间。
  激活的时间,是服务器返回的整数,不是客户端自动生成的。因为手机时间是可以改的。
3.激活过程
3.1 独立开发一个激活应用:romact.apk。存放在system区域。不能删除。
应用信息:文件名romact.apk,目录名romact,类包名com.minzuos.romactivate
界面制作中文语言,其他语言不支持。
3.2 激活应用启动时间
每次启动(第一次启动)或者显示(应用间切换)[设置]settings.apk的时候做是否已经激活的判断。
已激活:不做任何处理,继续设置操作。
未激活:判断网络(WIFI网络,移动网络)是否可用。
       网络不可用:不做任何处理,继续设置过程。
       网络可用 :启动激活应用。
3.3 激活应用参考设计画面。
3.4 激活过程是访问远程服务器,然后记录返回数值。
网址:http://www.minzuos.com/xdo/doactivate.php [^]
参数:要用POST方式,不用GET方式
romversion:MINZUOS版本,如:1.0.0-20150507-bacon
brand:手机厂家,品牌,如:Xiaomi
model:手机型号,如:2014811
device:手机设备,如:HM2014811
imei:手机序列号:737832127908765
响应数据:是json格式的数据
{
  status:"1",1=成功,1以外失败。
  datetime:"1434088755",
  message:"服务器给客户端端的文本信息,status=1时候,成功信息,status!=1时候失败信息!"
}
※无论成功与否,客户端都要显示由服务器返回的激活信息!
=================================================================
获取手机信息:
1.ROMVERSION
  系统ROM版本号
  就是MINZUOS版本,如:1.0.0-20150507-bacon
  其实就是包名minzuos-1.0.0-20150507-bacon.zip的一部分。
  怎么获取?
2.BRAND
  可能就是手机厂家,或者品牌。也许是子品牌
  ro.product.brand=oneplus
3.MODEL
  手机型号
  ro.product.model=A0001
4.DEVICE
  就是具体型号
  ro.product.device=A0001
5.IMEI
  如果是双卡,那么读取主卡(第一个)的。

大致讲解下,入口有三个,第一个是开机启动会自动启动romact.apk,第二个是打开setting设置的时候,启动
romact.apk。(这两个也不是每次都要启动,是需要判断的,系统是否激活,会在system区域保存一个常量值,如果激活,就会保存1,如果未激活,就会保存0.每次启动开机或者启动setting的时候,就会第一时间查询本地的状态值,然后决定是否启动romact.apk。如果本身已经激活了系统,不管是开机还是打开setting,都不会再启动romacr.apk了。)第三个就是独立打开romact.apk。


首先,这里用到了我以前从来没有用过也没有见过的属于系统的方法,存值和取值。

取值:Settings.System.getInt(ContentResolver cr, String name,int def)

存值:Settings.System.putInt(ContentResolver cr, String name, int def)

这两个方法的返回值类型是int类型,然后导包是android.provider.Settings

注:getint方法需要加权限<uses-permission android:name="android.permission.WRITE_SETTINGS" />

否则会报错。

Parameters:
cr The ContentResolver to access.
name The name of the setting to retrieve.
def Value to return if the setting is not defined.
Returns:  The setting's current value, or 'def' if it is not defined or not a valid integer.

第一个参数一般只需要歇上getContentResolver(),

第二个参数名字,好比是键值对,get和int的名字必须一致,才会共享存取的值。(名字自己随便取)

第三个参数,对于getInt()方法来说,当这个存储空间还没有建立,第一次取值不存在的时候,取到的是所给定的第三个参数,(这个值只用一次,就是第一次取值时候的默认值。以后的取值都是从空间中去,是多少就是多少。存储空间的值是put进去的)。对于putInt()方法来说,想调用存值的时候,只需要把自己的值存进去就可以了。


这中方法直接将值存到了系统的区域。


对于开机或者打开setting,当条件满足,启动romact.apk,是需要在romact.apk中写一个广播接受者,来接受前两者发送的广播。

<!-- 注册开机启动的广播接收器 -->
        <receiver android:name=".RomactReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="com.android.minzuos.romactivate.start.activate" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

<span style="font-size:14px;">当Android启动时,会发送以个广播,内容为:ACTION_BOOT_COMPLETED。它的字符串常量为android.intent.action.BOOT_COMPLETED</span>
开机的动作都是靠它来完成的。

第二个action 是用来匹配启动setting所发送的广播。

这是setting所发送的广播,这是一种隐式启动。

String boradcastIntent = "com.android.minzuos.romactivate.start.activate";
		Intent intent = new Intent(boradcastIntent);
		this.sendBroadcast(intent);

这是romact.apk接受广播的类

package com.minuzuos.romactivate;

import android.R.integer;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.NetworkInfo.State;
import android.net.Uri;
import android.os.Handler;
import android.preference.CheckBoxPreference;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.util.Log;
import android.widget.Toast;

public class RomactReceiver extends BroadcastReceiver {

	static final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";
	static final String ACTION_NETCHANGE = "android.net.conn.CONNECTIVITY_CHANGE";
	static final String ACTION_SETTING = "com.android.minzuos.romactivate.start.activate";

	private final static String SETTING_MODIFY_NAME = "com.minzuos.romactivate.activate.status";
	private final static String IS_OPEN_FLAG = "isornot.open.flag";

	String action = "";
	public SharedPreferences preferences;

	@Override
	public void onReceive(Context context, Intent intent) {
		preferences = PreferenceManager.getDefaultSharedPreferences(context);

		action = intent.getAction();
		boolean net_status = checkNetStatus(context);
		Log.i("test_pass", "当前网络状态" + net_status);
		// 一进来,首先知道是否激活,如果已经激活,就什么也不干,如果未激活,在进行判断操作
		int activate_status = Settings.System.getInt(
				context.getContentResolver(), SETTING_MODIFY_NAME, 0);
		if (activate_status == 0) { // 如果为0,则为未激活,再判断广播

			if (action.equals(ACTION_BOOT)) { //
				// 开机广播 ()
				preferences.edit().putInt(IS_OPEN_FLAG, 0).commit();

				if (net_status) { // 如果网络可用,就进入激活界面
					Intent startIntent = new Intent(context, MainActivity.class);
					startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
					context.startActivity(startIntent);

					preferences.edit().putInt(IS_OPEN_FLAG, 1).commit(); // 若启动过,将标志位设置为true,以后就不启动了

				} else {
					// 网络不可用,就什么也不做,就是不进入激活界面
				}
			} else if (action.equals(ACTION_SETTING)) { // settings的广播
				// 启动广播,首先取得激活状态值
				if (net_status) { // 如果网络可用,就进入激活界面
					Intent startIntent = new Intent(context, MainActivity.class);
					startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
					context.startActivity(startIntent);

					preferences.edit().putInt(IS_OPEN_FLAG, 1).commit();

				} else {
					// 网络不可用,就什么也不做,就是不进入激活界面
				}
			} else { // 网络状态的改变的广播
				if (preferences.getInt(IS_OPEN_FLAG, 0) == 0) { // 如果未启动过,就判断,在启动。(()

					ConnectivityManager connectivityManager = (ConnectivityManager) context
							.getSystemService(Context.CONNECTIVITY_SERVICE);
					if (connectivityManager != null) {
						NetworkInfo[] networkInfos = connectivityManager
								.getAllNetworkInfo();
						for (int i = 0; i < networkInfos.length; i++) {
							State state = networkInfos[i].getState();
							if (NetworkInfo.State.CONNECTED == state) {
								Intent startIntent = new Intent(context,
										MainActivity.class);
								startIntent
										.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
								context.startActivity(startIntent);
								preferences.edit().putInt(IS_OPEN_FLAG, 1)
										.commit();

								return;
							}
						}
					}
				} else { // 如果已启动过,就不再启动了

				}

			}
		} else {
		}

	}

	/**
	 * 检查网络是否可用
	 */
	public boolean checkNetStatus(Context context) {
		ConnectivityManager manager = (ConnectivityManager) context
				.getSystemService(context.CONNECTIVITY_SERVICE);
		NetworkInfo info = manager.getActiveNetworkInfo();
		if (info != null && info.isAvailable()) {
			return true;
		} else {
			return false;
		}
	}

}


其实这个类中的判断是开机发送的广播还是setting发送的广播,是没有必要的,因为他们所执行的操作是一致的。所以把判断去掉,这样不管广播是哪里发送的过来的,都会启动romact.apk。不过判断激活状态值是1还是0,这是必须的,如果是已经激活状态,就什么操作也不执行,就不会启动romact.apk。


对了,对ACTION_BOOT_COMPLETED的操作是需要加入权限的

   <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />


写到这里,今天研究了下finish()和System.exit(0)的区别:

System.exit(0);是退出整个应用,它会杀掉应用,释放应用程序所占用的资源。

finish();只是将当前的Activity关掉,也可以说是放到后台了,整个应用程序还是运行的。打Log就会发现,finish(0)方法后面的操作依旧会执行。finish并不会释放占用的资源。


这里还用到了post方法将客户端和服务端的数据进行交互,由于这是第一次操作json数据的交互,是参考别人的代码,并不是很理解。万事开头难,最起码能看懂了。

private void sendData() {
		new Thread(new Runnable() {
			@Override
			public void run() {
				// String remcersion = JSON.toJSONString("remcersion");//
				// 解析json字符串
				// 把所有的json数据一个个解析出来
				Log.i(TEST_TAG, "2222");
				try {
					HttpParams params = new BasicHttpParams();
					// 超时设置
					/* 从连接池中取连接的超时时间 */
					ConnManagerParams.setTimeout(params, 1000);
					/* 连接超时 */
					HttpConnectionParams.setConnectionTimeout(params, 2000);
					/* 请求超时 */
					HttpConnectionParams.setSoTimeout(params, 4000);

					DefaultHttpClient client = new DefaultHttpClient(params);
					HttpPost post = new HttpPost(path);// post请求
<span style="white-space:pre">					</span>// 这就是所谓的表单格式form

					List<BasicNameValuePair> nvps = new ArrayList<BasicNameValuePair>();
					nvps.add(new BasicNameValuePair("romversion",
							serviceInfoMap.get("romversion")));
					nvps.add(new BasicNameValuePair("brand", serviceInfoMap
							.get("brand")));
					nvps.add(new BasicNameValuePair("model", serviceInfoMap
							.get("model")));
					nvps.add(new BasicNameValuePair("device", serviceInfoMap
							.get("device")));
					nvps.add(new BasicNameValuePair("imei", serviceInfoMap
							.get("imei")));
					Log.i(TEST_TAG, nvps.toString());
					// [romversion=G620S-UL00V100R001C17B262, brand=HUAWEI,
					// model=G620S-UL00, device=hwG620S-UL00,
					// imei=865242025001258]

					// 这里就是从json中解析出来,给服务器发的参数
					post.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));

					// 服务器响应这里需要解析json数据,通过判断,提示成功失败
					HttpResponse response = client.execute(post);
					HttpEntity entity = response.getEntity();
					int res = response.getStatusLine().getStatusCode();
					Log.i(TEST_TAG, res + "");
					if (res == 200) {
						InputStream content = entity.getContent();
						int len = 0;
						StringBuffer sb = new StringBuffer();
						byte[] buff = new byte[1024];
						while ((len = content.read(buff)) != -1) {
							String temp = new String(buff, 0, len);
							sb.append(temp);
							temp = null;
						}
						Log.i(TEST_TAG, sb.toString());

						final JSONObject jsonObject = new JSONObject(sb
								.toString());
						// .optJSONObject("");
						// 每500ms发送一次信息,看这个是否取到,是不是一个是""
						new Thread(new Runnable() {

							@Override
							public void run() {
								while (true) {
									try {
										statusValue = jsonObject
												.getString("status");
									} catch (JSONException e1) {
										// TODO Auto-generated catch block
										e1.printStackTrace();
									}
									Message msg = new Message();
									msg.what = 1;
									msg.obj = statusValue;
									mHandler.sendMessage(msg);
									try {
										Thread.sleep(500);
									} catch (InterruptedException e) {
										// TODO Auto-generated catch block
										e.printStackTrace();
									}
								}
							}
						}).start();

					} else {
						Message msg = mHandler.obtainMessage();
						msg.what = 3;// 服务器连接失败
						mHandler.sendMessage(msg);
					}

				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				} catch (ClientProtocolException e) {
					e.printStackTrace();
					// mHandler.sendEmptyMessage(3);
				} catch (SocketException e) {
					// mHandler.sendEmptyMessage(3);
				} catch (IOException e) {
					// mHandler.sendEmptyMessage(3);
					e.printStackTrace();
				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}).start();
	}

如果要发送的JSON格式的字符串(不用传统的post方式发送。)

HttpPost request = new HttpPost(url);  
// 先封装一个 JSON 对象  
JSONObject param = new JSONObject();  
param.put("name", "rarnu");  
param.put("password", "123456");  
// 绑定到请求 Entry  
StringEntity se = new StringEntity(param.toString());   
request.setEntity(se);  
// 发送请求  
HttpResponse httpResponse = new DefaultHttpClient().execute(request);  
// 得到应答的字符串,这也是一个 JSON 格式保存的数据  
String retSrc = EntityUtils.toString(httpResponse.getEntity());  
// 生成 JSON 对象  
JSONObject result = new JSONObject( retSrc);  
String token = result.get("token"); 

最终与服务器交互代码以下为标准:

private void sendData1() {
		new Thread(new Runnable() {
			@Override
			public void run() {
				Log.i(TEST_TAG, "2222");
				try {

					HttpPost post = new HttpPost(ACTIVATE_PATH);// post请求
					// 先封装一个JSON对象
					JSONObject param = new JSONObject();
					param.put("romversion", serviceInfoMap.get("romversion"));
					param.put("brand", serviceInfoMap.get("brand"));
					param.put("model", serviceInfoMap.get("model"));
					param.put("device", serviceInfoMap.get("device"));
					param.put("imei", serviceInfoMap.get("imei"));
					// 绑定到请求Entry
					StringEntity se = new StringEntity(param.toString());
					post.setEntity(se);
					Log.i(TEST_TAG, "JSON为---> " + param.toString());
					// JSON为--->
					// {"device":"hwG620S-UL00","brand":"HUAWEI","model":"G620S-UL00","imei":"865242025001258","romversion":"G620S-UL00V100R001C17B264"}

					// 发送请求
					// DefaultHttpClient client = new DefaultHttpClient(params);
					HttpParams params = new BasicHttpParams();
					DefaultHttpClient localDefaultHttpClient = new DefaultHttpClient(
							params);
					localDefaultHttpClient.getParams().setParameter(
							"http.connection.timeout", Integer.valueOf(30000));
					localDefaultHttpClient.getParams().setParameter(
							"http.socket.timeout", Integer.valueOf(30000));
					HttpResponse response = localDefaultHttpClient
							.execute(post);
					// 得到应答的字符串,这也是一个JSON格式保存的数据
					String retStr = EntityUtils.toString(response.getEntity());
					// 生成JSON对象
					JSONObject result = new JSONObject(retStr);
					int status_value = response.getStatusLine().getStatusCode();
					Log.i(TEST_TAG, "" + status_value);
					String statusValue = "";
					statusValue = result.getString("status");
					Log.i(TEST_TAG, statusValue);
					if (!statusValue.equals("")) {
						// 如果不为空,说明取到了数据,然后就先关闭进去条
						mLoading.dismiss();
						// 然后判断值是否==1,来决定弹出哪个dialog
						// 激活成功,就把值传到系统的contentprovider,然后永久保存
						if (Integer.parseInt(statusValue) == 1) {
							mHandler.sendEmptyMessage(SHOW_SUCCESS);
							// showResultDialog(1); // 显示成功的dialog
							// 将值设置成1
							Settings.System.putInt(getContentResolver(),
									SETTING_MODIFY_NAME, 1);
						} else { // 只要是不为1外的其他值,都算失败,弹出失败的dialog
							mHandler.sendEmptyMessage(SHOW_FAILURE);
							// showResultDialog(0);
						}
					}

				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
					Log.i(TEST_TAG, "problem-->11111");
				} catch (ClientProtocolException e) {
					e.printStackTrace();
					Log.i(TEST_TAG, "problem-->22222");
					mHandler.sendEmptyMessage(CONTENT_STATUS);
				} catch (SocketException e) {
					Log.i(TEST_TAG, "problem-->33333");
					mHandler.sendEmptyMessage(CONTENT_STATUS);
				} catch (IOException e) {
					Log.i(TEST_TAG, "problem-->44444");
					mHandler.sendEmptyMessage(CONTENT_STATUS);
					e.printStackTrace();
				} catch (JSONException e) {
					Log.i(TEST_TAG, "problem-->5555");
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}).start();
	}
调试过程中出现了点问题,
HttpResponse response = localDefaultHttpClient.execute(post);
这句代码无论如何不能通过,此时网络是连接状态,后来意外换了个手机,发现通过了。

最后才发现,计时是网络连接状态,却没有检测网络是否可用。其实是假网络。所以导致无法交互。


json参考连接:

http://blog.csdn.net/dadoneo/article/details/6233366

http://407827531.iteye.com/blog/1266217




有人还推荐我用xUtils框架,说实话,确实不会用


接下来就是贴整代码。

MainActivity.class

package com.minuzuos.romactivate;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;

import android.R.integer;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

	private TextView content1;
	private Button btn_activate, btn_cancel, btn_close;
	// 存放手机五个信息的键值对map
	public Map<String, String> serviceInfoMap = new HashMap<String, String>();
	// 服务器地址
	private final static String ACTIVATE_PATH = "http://www.minzuos.com/do.romactivate.php";
	private final static String SETTING_MODIFY_NAME = "com.minzuos.romactivate.activate.status";
	private final static String TEST_TAG = "test_pass";
	private final static int CONTENT_STATUS = 3;
	private final static int SHOW_SUCCESS = 5;
	private final static int SHOW_FAILURE = 4;
	private final static int CLOSE_DIALOG = 2;

	// 初始化Dialog
	public Dialog waiting = null;

	Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case CONTENT_STATUS:
				Log.i(TEST_TAG, "连接失败"); // [niejianjian15-7-20xiugai]
				break;
			case CLOSE_DIALOG:
				waiting.dismiss();
				break;
			case SHOW_FAILURE:
				showResultDialog(0);
				break;
			case SHOW_SUCCESS:
				showResultDialog(1);
				break;
			default:
				break;
			}
		};
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 无标题设置
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		// 如果查询到值为1,就是已经激活,此时进入已激活界面,
		// 只有值为0,就是未激活状态的情况下,才会进入激活界面
		if (Settings.System
				.getInt(getContentResolver(), SETTING_MODIFY_NAME, 0) == 1) {
			setContentView(R.layout.activity_second);
			init2();
		} else {
			setContentView(R.layout.activity_main);
			init1();
		}
		Log.i(TEST_TAG, "1111");
		Log.i(TEST_TAG,
				""
						+ Settings.System.getInt(getContentResolver(),
								SETTING_MODIFY_NAME, 0));
		// 一进入激活程序,就开始查询信息。
		;

	}

	private void init2() {
		btn_close = (Button) findViewById(R.id.btn_close);
		btn_close.setOnClickListener(this);
	}

	private void init1() {

		getServicesInfo();

		content1 = (TextView) findViewById(R.id.content1);
		content1.setText("\u3000\u3000您的设备还未激活,只有成功激活后才能正确使用本系统。"
				+ "激活过程很简单,只要在联网状态下点击【激活】按钮即可。"
				+ "\n\u3000\u3000激活时我们只向服务器发送手机厂家,手机型号以及系统版本等三个信息,"
				+ "不包括您的个人信息,激活过程只需要做一次。"); // [niejianjian15-7-20xiugai]

		btn_activate = (Button) findViewById(R.id.btn_activate);
		btn_activate.setOnClickListener(this);

		btn_cancel = (Button) findViewById(R.id.btn_cancel);
		btn_cancel.setOnClickListener(this);

	}

	@Override
	public void onClick(View v) {
		int id = v.getId();
		switch (id) {
		case R.id.btn_activate:
			// 激活状态是进入是就判断的,如果能出现激活按钮,自然是为激活状态,此时就无需在判断状态之,直接进行操作
			// 点击激活按钮,直接进行激活操作,首先是判断网络状态,在进行可用和不可用的处理
			if (checkNetStatus()) { // 判断网络状态是否可用,就开始激活动作
				sendData1(); // 发送数据,取数据
				showDialog();
			} else { // 网络不可用,就弹窗提示设置网络
				showSetNetDialog();
			}

			break;
		case R.id.btn_cancel:
			System.exit(0);
			break;
		case R.id.btn_close:
			System.exit(0);
			break;
		}
	}

	private void showDialog() {
		waiting = new Dialog(this, R.style.dialog);
		waiting.setCancelable(false);
		waiting.setContentView(R.layout.romacting);
		waiting.show();
	}

	private void sendData1() {
		new Thread(new Runnable() {
			@Override
			public void run() {
				Log.i(TEST_TAG, "2222");
				try {

					HttpPost post = new HttpPost(ACTIVATE_PATH);// post请求
					// 设置添加对象
					List<NameValuePair> paramsForm = new ArrayList<NameValuePair>();
					paramsForm.add(new BasicNameValuePair("romversion",
							serviceInfoMap.get("romversion")));
					paramsForm.add(new BasicNameValuePair("brand",
							serviceInfoMap.get("brand")));
					paramsForm.add(new BasicNameValuePair("model",
							serviceInfoMap.get("model")));
					paramsForm.add(new BasicNameValuePair("device",
							serviceInfoMap.get("device")));
					paramsForm.add(new BasicNameValuePair("imei",
							serviceInfoMap.get("imei")));
					Log.i(TEST_TAG, paramsForm.toString());
					post.setEntity(new UrlEncodedFormEntity(paramsForm,
							HTTP.UTF_8));

					// 发送请求
					HttpParams params = new BasicHttpParams();
					DefaultHttpClient localDefaultHttpClient = new DefaultHttpClient(
							params);
					localDefaultHttpClient.getParams().setParameter(
							"http.connection.timeout", Integer.valueOf(30000));
					localDefaultHttpClient.getParams().setParameter(
							"http.socket.timeout", Integer.valueOf(30000));
					HttpResponse response = localDefaultHttpClient
							.execute(post);
					// 得到应答的字符串,这也是一个JSON格式保存的数据
					String retStr = EntityUtils.toString(response.getEntity());
					// 生成JSON对象
					JSONObject result = new JSONObject(retStr);
					int status_value = response.getStatusLine().getStatusCode();
					Log.i(TEST_TAG, "" + status_value);
					String statusValue = "";
					statusValue = result.getString("status");
					Log.i(TEST_TAG, "status: " + statusValue);
					Log.i(TEST_TAG, "datatime: " + result.getString("datatime"));
					Log.i(TEST_TAG, "message: " + result.getString("message"));
					if (!statusValue.equals("")) {
						// 如果不为空,说明取到了数据,然后就先关闭进去条
						mHandler.sendEmptyMessage(CLOSE_DIALOG);
						// 然后判断值是否==1,来决定弹出哪个dialog
						// 激活成功,就把值传到系统的contentprovider,然后永久保存
						if (Integer.parseInt(statusValue) == 1) {
							// 将值设置成1。需要加权限
							Settings.System.putInt(getContentResolver(),
									SETTING_MODIFY_NAME, 1);
							mHandler.sendEmptyMessage(SHOW_SUCCESS);
						} else { // 只要是不为1外的其他值,都算失败,弹出失败的dialog
							mHandler.sendEmptyMessage(SHOW_FAILURE);
						}
					}

				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
					mHandler.sendEmptyMessage(SHOW_FAILURE);
					mHandler.sendEmptyMessage(CONTENT_STATUS);
					mHandler.sendEmptyMessage(CLOSE_DIALOG);
				} catch (ClientProtocolException e) {
					e.printStackTrace();
					mHandler.sendEmptyMessage(SHOW_FAILURE);
					mHandler.sendEmptyMessage(CONTENT_STATUS);
					mHandler.sendEmptyMessage(CLOSE_DIALOG);
				} catch (SocketException e) {
					mHandler.sendEmptyMessage(SHOW_FAILURE);
					mHandler.sendEmptyMessage(CONTENT_STATUS);
					mHandler.sendEmptyMessage(CLOSE_DIALOG);
				} catch (IOException e) {
					mHandler.sendEmptyMessage(SHOW_FAILURE);
					mHandler.sendEmptyMessage(CONTENT_STATUS);
					mHandler.sendEmptyMessage(CLOSE_DIALOG);
					e.printStackTrace();
				} catch (JSONException e) {
					mHandler.sendEmptyMessage(SHOW_FAILURE);
					mHandler.sendEmptyMessage(CONTENT_STATUS);
					mHandler.sendEmptyMessage(CLOSE_DIALOG);
					e.printStackTrace();
				}
			}
		}).start();
	}

	/**
	 * 在联网的前提下,在还没有激活的情况下,点击激活操作的时候,不管成功与否,最后返回结果的提示框
	 */
	private void showResultDialog(int mm) {
		if (mm == 1) { // 激活成功
			AlertDialog.Builder builder = new Builder(this);
			builder.setIcon(R.drawable.ic_launcher);
			builder.setTitle("激活成功");
			builder.setMessage("您的终端激活成功!");
			builder.setPositiveButton("确定",
					new DialogInterface.OnClickListener() {

						@Override
						public void onClick(DialogInterface dialog, int which) {
							System.exit(0);
						}
					});
			builder.show();

		} else { // 激活失败
			AlertDialog.Builder builder = new Builder(this);
			builder.setIcon(R.drawable.ic_launcher);
			builder.setTitle("激活失败");
			builder.setMessage("激活失败,请重试或者检查网络设置!"); // [niejianjian15-7-20xiugai]
			builder.setNegativeButton("取消",
					new DialogInterface.OnClickListener() {

						@Override
						public void onClick(DialogInterface dialog, int which) {
							dialog.dismiss();
						}
					});
			builder.setPositiveButton("重试",
					new android.content.DialogInterface.OnClickListener() {

						@Override
						public void onClick(DialogInterface dialog, int which) {
							// 重新激活,重新发送数据,重新打开dialog
							sendData1(); // 发送数据,取数据
							waiting.show();
						}
					});
			builder.show();
		}
	}

	/**
	 * 检查网络是否可用
	 */
	public boolean checkNetStatus() {
		ConnectivityManager manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
		NetworkInfo info = manager.getActiveNetworkInfo();
		if (info != null && info.isAvailable()) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 在没有联网的情况下,激活操作是无法进行的,无法判断是否已经激活, 所以会先提示用户没有联网,弹框主动让用户设置网络
	 */
	private void showSetNetDialog() {
		// Toast.makeText(getApplicationContext(), "网络不可用", 0).show();
		// [niejianjian15-7-20delete]
		AlertDialog.Builder builder = new Builder(this);
		builder.setTitle("网络设置");
		builder.setMessage("当前无可用网络,请检查网络设置后重新激活!");
		builder.setPositiveButton("设置",
				new android.content.DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						Intent intent = new Intent(
								Settings.ACTION_WIFI_SETTINGS);
						startActivity(intent);
						// finish();
					}
				});
		builder.setNegativeButton("取消",
				new android.content.DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						dialog.dismiss();
					}
				});
		builder.show();
	}

	/**
	 * 进入应用程序,就会先获得手机的五个字段信息,然后将它们以键值对的形式,保存到map结合中,
	 * 然后向服务器发送数据的时候会用到,
	 */
	private void getServicesInfo() {

		// 每次都清空集合
		serviceInfoMap.clear();

		// romversion:获取系统ROM版本号
		// String strSystem = android.os.Build.DISPLAY;
		// String strSystem = getResources().getString("ro.cm.display.version")
		// ;
		// String strSystem = SystemProperties.get("ro.cm.display.version",
		// "aa");
		// String strSystem = android.os.Build.DISPLAY;
		// 想要获得系统的rom版本号,这是某个特定手机专有的一个字段。
		// 此时就需要查看手机原码,找到那个字段的value,从而获得它的key值,就是ro.cm.display.version
		// 然后通过调用android.os.SystemProperties类,它类似于android.Provider.Settings.System
		// 但是android.os.SystemPriperties是内部隐藏类,在应用程序编写过程中是无法调用的。(安全性,如果每个人都可以调用,轻易查询系统的方法,就不好了)
		// 此刻利用JNI来编写,但是这个不会,有点麻烦。
		// 还有就是把手机的SDK导入本地,然后关联这个SDK,再编写
		// 其实最方便的方法就是利用反射
		String strSystem = getRomVersion("ro.cm.display.version");
		Log.i(TEST_TAG, strSystem);
		serviceInfoMap.put("romversion", strSystem);

		// brand:获取手机厂商
		String strPhoneBrand = android.os.Build.MANUFACTURER;
		serviceInfoMap.put("brand", strPhoneBrand);

		// model:获取手机型号
		String strPhoneModle = android.os.Build.MODEL;
		serviceInfoMap.put("model", strPhoneModle);

		// device:获取手机具体型号
		String strPhoneDevices = android.os.Build.DEVICE;
		serviceInfoMap.put("device", strPhoneDevices);

		// imei:获取手机imei手机序列号
		TelephonyManager telephonyManager = (TelephonyManager) this
				.getSystemService(Context.TELEPHONY_SERVICE);
		String strImei = telephonyManager.getDeviceId();
		serviceInfoMap.put("imei", strImei);
	}

	public String getRomVersion(String key) {
		Class<?> clazz;
		try {
			clazz = Class.forName("android.os.SystemProperties");
			Method method = clazz.getDeclaredMethod("get", String.class);
			Log.i(TEST_TAG,
					"jieguo" + (String) method.invoke(clazz.newInstance(), key));
			return (String) method.invoke(clazz.newInstance(), key);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		}
		return "";
	}

}




然后是SecondActivity.class

public class SecondActivity extends Activity {

	private Button btn_close;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_second);

		btn_close = (Button) findViewById(R.id.btn_close);
		btn_close.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				System.exit(0);
			}

		});

	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// 判断:按下的是返回键,同时没有重复
		if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
			// 操作,由于进入当前SecondActivity界面的可能性只有一个,就是在已经激活的情况下,
			// 独立进入romact.apk。然后按下返回键,才会进入当前界面,既然已经激活,
			// 按返回键就没有必要在回到上一个界面,直接退出就挺好
			System.exit(0);
		}
		return super.onKeyDown(keyCode, event);
	}

}

还有就是receiver,之前已经贴了代码。


然后还有一个就是菊花加载进度条。

public class DialogUtils {

	/**
	 * 创建自定义ProgressDialog
	 */
	public static Dialog createLoadingDialog(Context context) {

		LayoutInflater inflater = LayoutInflater.from(context);
		View v = inflater.inflate(R.layout.layout_loading_dialog, null); // 得到加载view
		LinearLayout layout = (LinearLayout) v.findViewById(R.id.dialog_view); // 加载布局
		Dialog loadingDialog = new Dialog(context, R.style.loading_dialog); // 创建自定义样式dialog
		loadingDialog.setCancelable(false); // 不可以用"返回键"取消
		loadingDialog.setContentView(layout, new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.WRAP_CONTENT,
				LinearLayout.LayoutParams.WRAP_CONTENT));
		return loadingDialog;
	}
}



参考博客:

Android利用广播监听设备网络连接(断网)的变化情况 :http://www.open-open.com/lib/view/open1379302453943.html







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值