先上代码
class Test { public static void main(String []args) { Queue q=new Queue(); Producer p=new Producer(q); Consumer c=new Consumer(q); p.start(); c.start(); } } class Producer extends Thread { Queue q; Producer(Queue q) { this.q=q; } public void run() { for(int i=0;i<10;i++) { q.put(i); System.out.println("Producer put"+i); } } } class Consumer extends Thread { Queue q; Consumer(Queue q) { this.q=q; } public void run() { while(true) { System.out.println("Consumer get"+q.get()); } } } class Queue { int value; boolean bFull=false; public synchronized void put(int i) { if(!bFull) { value=i; bFull=true; notify(); } try{ wait(); } catch(Exception e) {} } public synchronized int get() { if(!bFull) { try { wait(); } catch(Exception e) { } } bFull=false; notify(); return value; } }
运行结果
Producer put0 Consumer get0 Consumer get1 Producer put1 Consumer get2 Producer put2 Consumer get3 Producer put3 Consumer get4 Producer put4 Consumer get5 Producer put5 Consumer get6 Producer put6 Consumer get7 Producer put7 Consumer get8 Producer put8 Consumer get9 Producer put9
暑假第三十五天,今天学习的是手机防盗软件的实现过程,感觉这个软件也挺不错的,所以拿出来和大家一块分享一下,其实通过本程序你可以学到,如何注册一个账号,还有广播时间,发送短信等功能,嗯,最近呢,表示对电脑很烦,每天10个小时以上都在电脑旁,这样的日子,我们足足过了三十多天,最近感觉小有不适,眼睛貌似都有不舒服,再加上天热,哎!我们这群痛并着快乐的程序员们,不过这样是日子也快结束了,等到8月底,自己就可以放心的回家喽,那样天天没有电脑的日子,可以享受一个月再继续开学,嗯,想家ing... ... 嘿嘿,废话不多说了看看实现的过程吧
1,先看看布局
main.xml一个编辑框两个按钮
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/bg" android:orientation="vertical" > <EditText android:id="@+id/safenumber" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="请输入可接受本手机短信的手机号" > </EditText> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="开始防盗" > </Button> <Button android:id="@+id/modify" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="修改密码" > </Button> </LinearLayout> </LinearLayout>2.password.xml 两个编辑框 ,两个按钮
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <EditText android:id="@+id/username" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="请输入用户名:" /> <EditText android:id="@+id/password" android:layout_width="fill_parent" android:layout_height="wrap_content" android:password="true" android:hint="请输入密码:" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/ok" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="确定" /> <!-- android:layout_weight="1" 权重设置占据1/2 --> <Button android:id="@+id/cancle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="取消" /> </LinearLayout> </LinearLayout>
3.看看主活动是实现的过程PhoneBakActivity.java
package com.wang; import android.app.Activity; import android.app.AlertDialog; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.telephony.TelephonyManager; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class PhoneBakActivity extends Activity { // 设置对话框 AlertDialog setPasswordDialog; // 显示对话框 AlertDialog showPasswordDialog; SharedPreferences sharedPreferences; EditText et_safenumber; Button btn_start; Button btn_modify; // o判断是否的第一次使用和是否已经开启防盗功能 boolean isFirst; boolean isStart; // 获取手机SIM卡的信息 TelephonyManager telephonyManager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 得到系统电话服务的权限 telephonyManager = (TelephonyManager) this .getSystemService(TELEPHONY_SERVICE); /*** * 保存用户的数据 检索和持有参数文件的内容的“名字”, 返回一个SharedPreferences, * 通过它可以检索和修改它的值,并保存在data文件夹下 */ sharedPreferences = this.getSharedPreferences("data", MODE_WORLD_READABLE); // 判断是否是第一次使用 isFirst = sharedPreferences.getBoolean("first", true); if (isFirst) { // 调用设置对话框的方法 showSetPasswordDialog(); return; } else { // 调用输入密码的方法 showInputPasswordDialog(); } } /**** * * 显示输入密码的对话框 * * * ***/ private void showInputPasswordDialog() { // 创建一个dialog AlertDialog.Builder builder = new AlertDialog.Builder(this); // 渲染器,进行对XML渲染成对象 LayoutInflater inflater = LayoutInflater.from(this); // 将布局添加到渲染器的对象中 View view = inflater.inflate(R.layout.password, null); // 实例化 组件 final EditText et_username = (EditText) view .findViewById(R.id.username); final EditText et_password = (EditText) view .findViewById(R.id.password); Button btn_ok = (Button) view.findViewById(R.id.ok); Button btn_cancle = (Button) view.findViewById(R.id.cancle); // 设置监听事件 btn_ok.setOnClickListener(new OnClickListener() { public void onClick(View v) { // 得到输入的密码和用户名 String username = et_username.getText().toString(); String password = et_password.getText().toString(); // 当输入的密码和用户名为空的时候提示一下 if (username.trim().equals("") || password.trim().equals("")) { Toast.makeText(PhoneBakActivity.this, "用户名和密码不能为空", Toast.LENGTH_LONG).show(); return; } // 得到保存的用户名和密码 String savedUsername = sharedPreferences.getString("username", ""); String savedPassword = sharedPreferences.getString("password", ""); // 如果用户名和密码相同的时候 if (username.trim().equals(savedUsername) && password.trim().equals(savedPassword)) { // 调用init方法 init(); // 取消输入密码的dialog showPasswordDialog.dismiss(); } else { // 提示 Toast.makeText(PhoneBakActivity.this, "用户名或者密码错误,请重新输入", Toast.LENGTH_LONG).show(); return; } } }); btn_cancle.setOnClickListener(new OnClickListener() { public void onClick(View v) { // 结束 finish(); } }); // 标题 builder.setTitle("输入密码"); // 构造view对象 builder.setView(view); // 创建和显示对话框 showPasswordDialog = builder.create(); showPasswordDialog.show(); } /****** * 初始化的方法 * * * ****/ private void init() { setContentView(R.layout.main); // 实例化组件 et_safenumber = (EditText) this.findViewById(R.id.safenumber); btn_start = (Button) this.findViewById(R.id.start); btn_modify = (Button) this.findViewById(R.id.modify); // 得到输入的手机号 String savedNumber = sharedPreferences.getString("safenumber", ""); et_safenumber.setText(savedNumber); // 判断是否关闭或者开启防盗功能 isStart = sharedPreferences.getBoolean("start", false); if (isStart) { // 设置激活状态为flase et_safenumber.setEnabled(false); btn_modify.setEnabled(false); btn_start.setText("停止防盗"); } btn_start.setOnClickListener(new OnClickListener() { public void onClick(View v) { // 如果开启 if (isStart) { // 保存到编辑器中 Editor editor = sharedPreferences.edit(); editor.putBoolean("start", false); // 保存手机号到编辑器中 editor.commit(); // 设置激活状态为true et_safenumber.setEnabled(true); btn_modify.setEnabled(true); btn_start.setText("开始防盗"); isStart = false; } else { // 获得输入的安全是手机号码 String safeNumber = et_safenumber.getText().toString(); // 当输入的手机号码为空的时候,提示一下 if (safeNumber.trim().equals("")) { Toast.makeText(PhoneBakActivity.this, "安全号码不能为空,请重新设置", Toast.LENGTH_LONG).show(); return; } else { // 得到字符串的电话号码为1号线,对GSM手机MSISDN。。 String phoneNumber = telephonyManager.getLine1Number(); // IMSI可以区分SIM卡的标示 String subScribeerId = telephonyManager .getSubscriberId(); // 保存手机号到数据文件中 Editor editor = sharedPreferences.edit(); editor.putString("safenumber", safeNumber); isStart = true; editor.putBoolean("start", isStart); editor.putString("subscriberid", subScribeerId); editor.commit(); // 设置激活状态为false btn_modify.setEnabled(false); et_safenumber.setEnabled(false); btn_start.setText("停止防盗"); } } } }); btn_modify.setOnClickListener(new OnClickListener() { public void onClick(View v) { // 调用设置密码的dialog showSetPasswordDialog(); } }); } /**** * 设置对话框的方法 * * * ****/ private void showSetPasswordDialog() { // 创建一个对话框 AlertDialog.Builder builder = new AlertDialog.Builder(this); // 渲染器,进行对XML渲染成对象 LayoutInflater inflater = LayoutInflater.from(this); // 把布局工具渲染出view对象 View view = inflater.inflate(R.layout.password, null); // 实例化组件 final EditText et_username = (EditText) view .findViewById(R.id.username); final EditText et_password = (EditText) view .findViewById(R.id.password); Button btn_ok = (Button) view.findViewById(R.id.ok); Button btn_cancle = (Button) view.findViewById(R.id.cancle); // 对按钮设置监听时间 btn_ok.setOnClickListener(new OnClickListener() { public void onClick(View v) { // 得到输入的用户名和密码 String username = et_username.getText().toString(); String password = et_password.getText().toString(); // 如果用户名和密码为空的时候 if (username.trim().equals("") || password.trim().equals("")) { Toast.makeText(PhoneBakActivity.this, "用户名和密码不能为空", Toast.LENGTH_LONG).show(); return; } // 获得编辑器 Editor editor = sharedPreferences.edit(); // 向编辑添加用户名和密码 editor.putString("username", username); editor.putString("password", password); // 改变first为flase editor.putBoolean("first", false); // 保存编辑好 的数据 editor.commit(); // 取消设置密码的dialog setPasswordDialog.dismiss(); init(); } }); btn_cancle.setOnClickListener(new OnClickListener() { public void onClick(View v) { if (isFirst) { // 退出 finish(); } else { setPasswordDialog.dismiss(); } } }); // 是在标题 builder.setTitle("设置密码"); // 构造view对象 builder.setView(view); // 创建和显示对话框 setPasswordDialog = builder.create(); setPasswordDialog.show(); } }4.接着看看开机的时候的处理bootReceiver.java获得开机后的广播事件
package com.wang; import java.util.List; import javax.net.ssl.ManagerFactoryParameters; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.telephony.TelephonyManager; import android.telephony.SmsManager; public class bootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //获得保存 的数据 SharedPreferences sharedPreferences = context.getSharedPreferences( "data", Context.MODE_WORLD_WRITEABLE); TelephonyManager telephonyManager = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); //判断是否开始 boolean istart = sharedPreferences.getBoolean("start", false); if (!istart) { return; } else { //获得subscriberid ,safenumber ,subscriberid String savesubscriberid = sharedPreferences.getString( "savesubscriberid", ""); String safenumber = sharedPreferences.getString("safenumber", ""); // String subscriberid = telephonyManager.getSubscriberId(); System.out.println(subscriberid); //如果保存的savesubscriberid相同 if (subscriberid.trim().equals(savesubscriberid)) { return; } else { //获得smsManager对象,可拥有超空断线的权限 SmsManager smsManager = SmsManager.getDefault(); //list保存长的分条短信 List<String> message = smsManager.divideMessage("手机的IMSI码为:" + savesubscriberid + "的手机,SIM卡已被替换,更换IMSI码为:" + subscriberid); for (String msg : message) { smsManager.sendTextMessage(safenumber, null, msg, null, null); } } } } }5.接着看发送短信的实现SMSReceiver.java
package com.wang; import java.util.List; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.telephony.SmsManager; import android.telephony.SmsMessage; public class SMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 获得保存 的数据 SharedPreferences sharedPreferences = context.getSharedPreferences( "data", Context.MODE_WORLD_WRITEABLE); boolean isstart = sharedPreferences.getBoolean("start", false); // 获得保存的savephonenumber电话号码 String savephonenumber = sharedPreferences.getString("safenumber", ""); // 判断是否开始 if (isstart) { // 获得短信的pdus格式,并转成object类 Object[] objects = (Object[]) intent.getSerializableExtra("pdus"); // 一条短信的一个byte【】的的数组,多条就是二维的 byte[][] puds = new byte[objects.length][]; // for (int i = 0; i < puds.length; i++) { puds[i] = (byte[]) objects[i]; } // 每一条短信对象 SmsMessage[] message = new SmsMessage[objects.length]; for (int i = 0; i < puds.length; i++) { // 创建一个SmsMessage从原始PDU。 message[i] = SmsMessage.createFromPdu(puds[i]); } for (int i = 0; i < message.length; i++) { // dd得到短信的地址号码 String Address = message[i].getDisplayOriginatingAddress(); // 如果保存的电话号码相同的时候 if (Address.trim().equals(savephonenumber)) { // d得到短信的内容 String body = message[i].getDisplayMessageBody(); // 如果短信包含的内容是试探的信息 if (body.contains(" affernoon good")) { // 管理短讯服务, SmsManager smsManager = SmsManager.getDefault(); // 分条发送短息 List<String> message1 = smsManager .divideMessage("你捡到了我的手机,请归还,联系方式:0000000000000"); for (String msg : message1) { // 发送短信到savephonenumber smsManager.sendTextMessage(savephonenumber, null, msg, null, null); } } } } } } }6.亲,别忘了添加权限和注册服务哦!!
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.wang" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".PhoneBakActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 广播服务注册 发送短信的服务 --> <receiver android:name=".SMSReceiver" > <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> <!-- 广播服务注册开机的广播android.intent.action.BOOT_COMPLETED开机启动的广播事件 --> <receiver android:name=".bootReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> </application> <!-- 1,接受短信的权限 ,2,读取手机状态的权限 3.发送短信的权限 --> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" > </uses-permission> <uses-permission android:name="android.permission.SEND_SMS" > </uses-permission> </manifest>
7.然后呢,就可以看到运行结果咯,运行结果如下:第一张图片是第一次使用时候设置用户名和密码,第二张是向另一个自己的手机,发送丢失手机的信息
第三张是点击开始防盗是时候的时间,第四张是点击修改密码的时候的事件
-(NSString *)getRecordFilePath{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"test.plist"];
return path;
}
-(NSMutableArray *)readLevelData{
NSString * filePath=[self getRecordFilePath];
// NSLog(@"this is filePath : %@",filePath);
self.myInfo_array=[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
if (!myInfo_array) {
[self setDate];
}
return myInfo_array;
}
-(void)saveLevelData {
NSString *path = [self getRecordFilePath];
BOOL boo=[NSKeyedArchiver archiveRootObject:self.myInfo_array toFile:path];
NSLog(@"储存 bool : %d",boo);
}