rcre管理器低版本2.3.5版本的钉钉

HTC G11手机官网刷机ROM-2.3.5-Sense3.5,诸多细节优化,适合长期使用
绿色版在手机上看
/ 系统优化 /
/ 系统优化 /
/ 输入法 /
/ 手机应用 /
/ 系统优化 /
1.添加快速启动和时间插件、很多人需要2.更改源为国内天气源、测试2G/3G均能更新3.添加微博客户端、方便登录微博4.更新安智市场为3.2版、方便好用5.减小挂机反应时间、通话后黑屏6.优化网速(通过提升缓存的方式)7.VM管理机构优化、提升流畅度8.优化EXT4分区、提升I/O性能9.SD卡速度优化、测试有一定的提升10.调整CPU频率设置、降低电量消耗11.汉化高级电源菜单、中文使用更方便12.汉化下拉菜单中Beats Audio为魔声音效13.ROM中所有第三方应用程序均可自由卸载14.自动识别APN、显示中国移动、中国联通15.修改GPS端口、更迅速更准确16.更多修改优化、自行下载刷机体验刷写方法:1.使用4EXT系列REC、最新版本:4EXTRecovery Touch 1.0.0.3 RC32.拷贝ROM到SD卡根目录、进入REC选择 & wipe | format &进入下一级菜单3.选择&format all partitions (except sdcard)&(注意提前做好备份)4.选择&stall from sdcard&→&choose zip from sdcard&,找到你拷贝的ROM文件、点击进入刷写                
           
手机界面手机界面(显示天气和时间及快捷图标)手机界面(只显示时间和天气)重新启动全部应用程序安装应用程序的位置音乐的通知设置界面软件信息界面
HTC G11手机官网刷机ROM-2.3.5-Sense3.5,诸多细节优化,适合长期使用
下载帮助网侠手机站软件均来自互联网, 如有侵犯您的版权, 请点击网站底部在线QQ进行联系。
1.网侠手机站所有软件和游戏都经过严格安装检测,保证不会有任何病毒木马等信息,请大家放心使用;
2.大家在安装软件的时候注意每个步骤,注意包含安装插件信息,推荐使用下载本站软件以获取最佳的下载速度。
3.如果您觉得网侠还不错, 以便下一次的访问.
4.网侠QQ群:应用软件交流群: 手机游戏交流:基于goldfish跟android2.3.5学习之:开天辟地Android启动机制[二]_大二用java开发的一个不要数据库支持的通讯录_手机防盗软件的兑现__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
基于goldfish跟android2.3.5学习之:开天辟地Android启动机制[二]
大二用java开发的一个不要数据库支持的通讯录
手机防盗软件的兑现
基于goldfish跟android2.3.5学习之:开天辟地Android启动机制[二]
基于goldfish和android2.3.5学习之:开天辟地Android启动机制[二]
***************************************************************************************************************************
作者:EasyWave
类别:Android系统源码分析
声明:转载,请保留链接
注意:如有错误,欢迎指正。这些是我学习的日志文章......
***************************************************************************************************************************
在我的博文基于goldfish和android2.3.5学习之:开天辟地Android启动机制[一]中,介绍了整个android系统的启动机制,这次将更深入的详细分析android的uevent的机制以及如何android是如何透过内核传递过来的数据通过uevent建立设备节点以及一些hotplug事件。在Andorid2.3.5源码system/core/init.c函数中ueventd_main()函数。详细的代码如下:
if (!strcmp(basename(argv[0]), "ueventd")) //得到运行程序ueventd.rc的全路径名下的ueventd
return ueventd_main(argc, argv); //如果可以找到ueventd.rc,则执行ueventd_main函数这里有个函数不得不说,这个函数就是basename函数,这个函数的主要作用就是得到ueventd.rc文件所在路径下的文件名,即ueventd。这个函数的具体的代码如下:
#include &sys/cdefs.h&
#include &errno.h&
#include &libgen.h&
#include &stdlib.h&
#include &string.h&
#include &sys/param.h&
char* basename(const char*
static char*
bname = NULL;
if (bname == NULL) {
bname = (char *)malloc(MAXPATHLEN);
if (bname == NULL)
return(NULL);
ret = basename_r(path, bname, MAXPATHLEN);
return (ret & 0) ? NULL :
上面这个最终是调用basename_r函数来解析ueventd.rc所在的路径下的ueventd的文件名。这个函数式在bionic/libc/bionic/basename.c中。具体的实现函数却是在basename_r函数中,这个函数也是在bionic/libc/bionic/basename_r.c中来实现的,具体的代码如下:
#include &libgen.h&
#include &errno.h&
#include &string.h&
#include &sys/param.h&
int basename_r(const char* path, char*
buffer, size_t
bufflen)//返回路径中文件名的安全函数
const char *endp, *
/* Empty or NULL string gets treated as "." */
if (path == NULL || *path == '\0') {
/* Strip trailing slashes */
endp = path + strlen(path) - 1;
while (endp & path && *endp == '/')
/* All slashes becomes "/" */
if (endp == path && *endp == '/') {
startp = "/";
/* Find the start of the base */
while (startp & path && *(startp - 1) != '/')
len = endp - startp +1;
if (buffer == NULL) {
if (len & (int)bufflen-1) {
= (int)bufflen-1;
result = -1;
if (len &= 0) {
memcpy( buffer, startp, len );
buffer[len] = 0;
透过上面的basename_r函数我们可以看出来主要是将目录路径"/"一个一个找出来并且丢弃,最终找到ueventd与strcmp(basename(argv[0]),
"ueventd")进行比较,如果找到文件,则进入ueventd_main(argc, argv);进行uevent事件的主循环的处理中。在android2.3.5源码中system/core/rootdir/中ueventd.rc文件如下:
/dev/random
/dev/urandom
/dev/ashmem
/dev/binder
# logger should be world writable (for logging) but not readable
/dev/log/*
# the msm hw3d client device node is world writable/readable.
/dev/msm_hw3dc
# gpu driver for adreno200 is globally accessible
# these should not be world writable
/dev/diag_arm9
/dev/android_adb
/dev/android_adb_enable
/dev/ttyMSM0
/dev/ttyHS0
/dev/uinput
/dev/alarm
/dev/graphics/*
/dev/msm_hw3dm
/dev/input/*
/dev/pmem_adsp*
/dev/pmem_camera*
/dev/oncrpc/*
/dev/adsp/*
/dev/snd/*
/dev/mt9t013
/dev/msm_camera/*
/dev/akm8976_daemon
/dev/akm8976_aot
/dev/akm8973_daemon
/dev/akm8973_aot
/dev/bma150
/dev/cm3602
/dev/akm8976_pffd
/dev/lightsensor
/dev/msm_pcm_out*
/dev/msm_pcm_in*
/dev/msm_pcm_ctl*
/dev/msm_snd*
/dev/msm_mp3*
/dev/audience_a1026*
/dev/tpa2018d1*
/dev/msm_audpre
/dev/msm_audio_ctl
/dev/htc-acoustic
/dev/q6venc
/dev/snd/dsp
/dev/snd/dsp1
/dev/snd/mixer
/dev/qemu_trace
/dev/bus/usb/*
/dev/usb_accessory
# CDMA radio interface MUX
/dev/ts0710mux*
# sysfs properties
/sys/devices/virtual/input/input*
/sys/devices/virtual/input/input*
poll_delay
/sys/devices/virtual/usb_composite/*
而ueventd_main的代码见下面,现在更深入的来分析下这个函数。这个函数式在system/core/init/ueventd.c
int ueventd_main(int argc, char **argv)
char tmp[32];
open_devnull_stdio(); //打开/dev/__null,并且重定向stdin、stdout、stderr
log_init(); //打开log文件
INFO("starting ueventd\n");
get_hardware_name(hardware, &revision); //透过/proc/cpuinfo得到当前项目的hardware以及revision
ueventd_parse_config_file("/ueventd.rc"); //解析ueventd.rc文件
snprintf(tmp, sizeof(tmp), "/ueventd.%s.rc", hardware);
ueventd_parse_config_file(tmp); //解析ueventd.xxxxxx.rc文件,比如:goldfish为ueventd.goldfish.rc文件
device_init();
ufd.events = POLLIN;
ufd.fd = get_device_fd();
while(1) {
ufd.revents = 0;
nr = poll(&ufd, 1, -1);
if (nr &= 0)
if (ufd.revents == POLLIN)
handle_device_fd();
首先来分析下open_devnull_stdio();这个函数,这个主要是打开/dev/null,同时将stdin,stdout,stderr进行重定向,具体的代码如下:
void open_devnull_stdio(void)
static const char *name = "/dev/__null__";
if (mknod(name, S_IFCHR | 0600, (1 && 8) | 3) == 0) { //设置节点属性,S_IFCHR:也就是说这是一个字符设备。0600是文件的属性。
fd = open(name, O_RDWR); //打开/dev/__null__设备
unlink(name); //删除一个文件的目录项并减少它的链接数
if (fd &= 0) {
//打开成功
dup2(fd, 0); //重定向stdin
dup2(fd, 1); //重定向stdout
dup2(fd, 2); //重定向stderr
if (fd & 2) { //关闭文件并且返回成功
close(fd);
//否则返回失败
}而log_init();主要是建立一个msg的log文件以记录上面的操作的记录文件。其函数代码如下[这个函数就不深究了,很容易看得懂。代码如下:
void log_init(void)
static const char *name = "/dev/__kmsg__";
if (mknod(name, S_IFCHR | 0600, (1 && 8) | 11) == 0) {
log_fd = open(name, O_WRONLY);
fcntl(log_fd, F_SETFD, FD_CLOEXEC); //设置文件为FD_CLOEXEC,这标志大家可以到网络搜索具体的意思,主要跟exec()函数有关的。
unlink(name);
}同时这个函数需要说下,这个函数就是get_hardware_name(hardware, &revision);这个是透过/proc/cpuinfo得到当前硬件的名称和版本,相信做linux和android内核移植和驱动开发的,应该都知道这个命令:cat
/proc/cpuinfo 吧,这个可以在自己的开发板上去测试下,看看会出现什么内容。现在重点分析ueventd_parse_config_file("/ueventd.rc");这个函数。这个函数式ueventd的重点之重,函数代码如下:
int ueventd_parse_config_file(const char *fn)
data = read_file(fn, 0);
if (!data) return -1;
parse_config(fn, data);
这里面的read_file(fn,0)主要是读取ueventd.rc的文件大小,并且存储在内存中。而parse_config(fn, data);这个才是重点,这是解析ueventd.rc文件的,这个函数是在system/core/init/ueventd_parser.c中,现在来深入的分析这个函数。
static void parse_config(const char *fn, char *s)
struct parse_
char *args[UEVENTD_PARSER_MAXARGS];
nargs = 0;
state.filename =
state.line = 1;
state.ptr =
state.nexttoken = 0;
state.parse_line = parse_line_ //具体的解析device,这是一个回调函数
for (;;) {
int token = next_token(&state); //循环查找ueventd.rc中的/dev/null, /dev/zero等
switch (token) {
case T_EOF:
state.parse_line(&state, 0, 0);
//到了ueventd.rc的末尾的话,做最后的解析,并直接返回
case T_NEWLINE:
//如果到了换了一行的时候,去做ueventd.rc的解析工作
if (nargs) {
state.parse_line(&state, nargs, args);
nargs = 0;
case T_TEXT: //如果正在解析本行的数据,详细见ueventd.rc文件
if (nargs & UEVENTD_PARSER_MAXARGS) {
args[nargs++] = state.
}这个函数在/dev/的都是只有四个可选参数,而只有在/sys/下的时候多了一个attr的选项,也就是5个选项。具体的解析在parse_line_device函数中的set_device_permission()有详细的处理。具体的代码如下:
void set_device_permission(int nargs, char **args)
char *attr = 0;
int prefix = 0;
char *tmp = 0;
if (nargs == 0)
if (args[0][0] == '#')
name = args[0]; //就拿ueventd.rc文件中/dev/null
root 和 /sys/devices/virtual/input/input*
input 来说吧
if (!strncmp(name,"/sys/", 5) && (nargs == 5)) { //查找/sys/的设备,一般都是有5个参数的。
INFO("/sys/ rule %s %s\n",args[0],args[1]);
attr = args[1]; //因此将args[1]赋值给attr
if (nargs != 4) { //如果参数不对,则直接退出,不解析了,因为出错了。
ERROR("invalid line ueventd.rc line for '%s'\n", args[0]);
/* If path starts with mtd@ lookup the mount number. */
if (!strncmp(name, "mtd@", 4)) { //查找是否有mtd分区,如果有这mount mtd分区
int n = mtd_name_to_number(name + 4);
if (n &= 0)
asprintf(&tmp, "/dev/mtd/mtd%d", n);
} else { //否则就做常规的设备解析
int len = strlen(name);
if (name[len - 1] == '*') {
prefix = 1;
// 如果设备中'*'字符,这告诉add_dev_perms有前缀符号,比如:/dev/input/*
也就是这个有可能会有0,1,2,3等多个。
name[len - 1] = '\0';
perm = strtol(args[1], &endptr, 8); //将args[1]转换为8进制,比如字符0666转换为真正的整形。
if (!endptr || *endptr != '\0') {
ERROR("invalid mode '%s'\n", args[1]);
free(tmp);
ret = get_android_id(args[2]); //得到android_id定义的name,具体见:android_ids表格。
if (ret & 0) {
ERROR("invalid uid '%s'\n", args[2]);
free(tmp);
uid = //设置用户id
ret = get_android_id(args[3]); //得到android_id定义的id,具体见:android_ids表格,下一节会深入分析
if (ret & 0) {
ERROR("invalid gid '%s'\n", args[3]);
free(tmp);
gid = //设置group的id
add_dev_perms(name, attr, perm, uid, gid, prefix); //添加到链表中。
free(tmp);
在add_dev_perms()函数中,主要将/dev和/sys/ 分别添加到不同的链表中,具体的函数的实现如下:
int add_dev_perms(const char *name, const char *attr,
mode_t perm, unsigned int uid, unsigned int gid,
unsigned short prefix) {
struct perm_node *node = calloc(1, sizeof(*node));
if (!node)
return -ENOMEM;
node-&dp.name = strdup(name);
if (!node-&dp.name)
return -ENOMEM;
if (attr) {
node-&dp.attr = strdup(attr);
if (!node-&dp.attr)
return -ENOMEM;
node-&dp.perm =
node-&dp.uid =
node-&dp.gid =
node-&dp.prefix =
list_add_tail(&sys_perms, &node-&plist);
list_add_tail(&dev_perms, &node-&plist);
还未完,具体的分析在《基于goldfish和android2.3.5学习之:开天辟地Android启动机制[三]》 来分析。。。。
大二用java开发的一个不要数据库支持的通讯录
大二用java开发的一个不用数据库支持的通讯录
在大二第一学期的时候,在学习了JAVA中的输入输出流后老师要我们做一个通讯录。其功能可以添加删除和在关闭时保存信息,保存和导入数据用的技术是纯粹的IO流,没有设计到数据库,呵呵,功能是实现出来了,但效率可能不怎么好,希望高手们看完后给小弟点意见,我会改进的,OK,以下是我的原代码和试用方法说明:代码:import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.io.*;import javax.swing.border.*;import java.util.*;class People implements Serializable{
static int j2=0;
static int j3=0;
static int munber=0;
//这个就是整个程序的计数器private static final long serialVersionUID = 4182471L;
String ID;String NString AString PString Wprotected OPeople(String ID,String Name,String Address,String Phone,String Work){
this.ID=ID;
this.Name=N
this.Address=A
this.Phone=P
this.Work=W
}String getID(){
return ID;
}String getName(){
}String getAddress(){
}String getWork(){
return W}static public String id()//变数据为字符{
Integer id=new Integer(2);
String iD=id.toString();
return iD;}static public String id2()//添加自加功能的方法,显示在文本框上{
int j1=j+1;
Integer id2=new Integer(1);
String jd=id2.toString();
public String getValue()
String value="ID号:"+ this.ID+"
"+"姓名:"+this.Name+"
"+"地址:"+this.Address+"
"+"电话:"+this.Phone+"
"+"单位:"+this.Work+'\n';
public class tongxunlu extends JFrame{
private static final long serialVersionUID = 9006743L;
//初始化窗口实现类 JTextField ID;JTextField NJTextField AJTextField PJTextField WJTextField IDc;JTextField NJTextField AJTextField PJTextField WJButton AJButton CJButton LJButton SJButton DJButton CJPanel P1;JPanel P2;JTextArea SJTextArea Show2;JTabbedP
Box baseBox,baseBox2,boxV1,boxV2,boxV3,boxV4,boxV5;
FileOutputStream fileO
ObjectOutputStream objectO FileInputStream fileIn;ObjectInputStream objectIn;FileOutputStream fileOut2;FileInputStream fileIn2; DataInputStream dataIDataOutputStream dataOFileWFileRPeople p1[]=new People[100];
//构造存储数组People personLoad[]=new People[100]; People personSave[]=new People[100]; People person[]=new People[100];
//定义person为保存对象的数组,容量是100个对象tongxunlu (String s){ super(s);
Container con=getContentPane();
Show=new JTextArea();
Show2=new JTextArea();
p=new JTabbedPane();
P1=new JPanel();
P2=new JPanel();
ID=new JTextField(4);
Name=new JTextField(6);
Address=new JTextField(20);
Phone=new JTextField(8);
Work=new JTextField(18);
IDc=new JTextField(4);
Namec=new JTextField(6);
Addressc=new JTextField(20);
Phonec=new JTextField(8);
Workc=new JTextField(18);
Add=new JButton("添加");
Clear=new JButton("清空");
Load=new JButton("导入资料");
Delect=new JButton("删除");
Save=new JButton("保存");
Check=new JButton("查询");
boxV1=Box.createVerticalBox();
boxV1.add(new JLabel("输入您的ID:"));
boxV1.add(Box.createVerticalStrut(31));
boxV1.add(new JLabel("请输入您的姓名:"));
boxV1.add(Box.createVerticalStrut(31));
boxV1.add(new JLabel("请输入您的地址:"));
boxV1.add(Box.createVerticalStrut(31));
boxV1.add(new JLabel("请输入您的电话:"));
boxV1.add(Box.createVerticalStrut(31));
boxV1.add(new JLabel("请输入您的单位:"));
boxV2=Box.createVerticalBox();
boxV2.add(ID);
boxV2.add(Box.createVerticalStrut(8));
boxV2.add(Name);
boxV2.add(Box.createVerticalStrut(8));
boxV2.add(Address);
boxV2.add(Box.createVerticalStrut(8));
boxV2.add(Phone);
boxV2.add(Box.createVerticalStrut(8));
boxV2.add(Work);
baseBox=Box.createHorizontalBox();
baseBox.add(boxV1);
baseBox.add(Box.createHorizontalStrut(10));
baseBox.add(boxV2);
boxV3=Box.createVerticalBox();
boxV3.add(new JLabel("输入您要查找或删除的ID:"));
boxV3.add(Box.createVerticalStrut(8));
boxV4=Box.createVerticalBox();
boxV4.add(Box.createVerticalStrut(100));
boxV4.add(IDc);
boxV4.add(Box.createVerticalStrut(110));
boxV5=Box.createVerticalBox();
boxV5.add(Check);
boxV5.add(Box.createVerticalStrut(8));
boxV5.add(Delect);
boxV5.add(Box.createVerticalStrut(8));
baseBox2=Box.createHorizontalBox();
baseBox2.add(boxV3);
baseBox2.add(Box.createHorizontalStrut(10));
baseBox2.add(boxV4);
baseBox2.add(Box.createHorizontalStrut(10));
baseBox2.add(boxV5);
p.add("添加信息", baseBox);
p.add("查询或删除", baseBox2);
p.add("显示",new JScrollPane(Show));
p.add("资料库",new JScrollPane(Show2));
p.validate();
P2.add(Add);
P2.add(Clear);
P2.add(Save);
P2.add(Load);
con.add(p,BorderLayout.CENTER);
con.add(P2,BorderLayout.SOUTH);
con.validate();
setBounds(0,0,333,333);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Add.addActionListener(new ActionListener(){
//至此完成了窗口的设置.以下开始功能实现了
public void actionPerformed(ActionEvent e){
String iid=ID.getText();
People.j=Integer.parseInt(iid);
ID.setText(People.id2());
String name=Name.getText();
String address=Address.getText();
String phone=Phone.getText();
String work=Work.getText();
int count=People.j-1;
//记录添加人数下标
personSave[count]=new People(People.id(),name,address,phone,work);
String value=personSave[count].getValue();
String value2="您刚刚添加的信息是:"+
Show.insert(value2,Show.getDocument().getLength());//可在当前显示插入信息
catch(Exception a){System.out.println(a);}
Save.addActionListener(new ActionListener(){
//此方法可以把保存数组里面的所有当前对象写入文件
public void actionPerformed(ActionEvent e2){
File f=new File("a.txt");
fileOut=new FileOutputStream(f);
objectOut=new ObjectOutputStream(fileOut);
catch(Exception a)
System.out.println(a);
for(int i2=0;i2&=People.j-1;i2++)
objectOut.writeObject(personSave[i2]);
catch (IOException e22) {
e22.printStackTrace();
Load.addActionListener(new ActionListener(){
//此方法可以把文件里面的保存对象读入
public void actionPerformed(ActionEvent e2){
fileIn=new FileInputStream("a.txt");
objectIn=new ObjectInputStream(fileIn);
while(( personSave[n]=(People)objectIn.readObject())!=null)
Show2.insert(personSave[n].getValue(),Show2.getDocument().getLength());
People.munber=n;
//计数器计数
catch(Exception a)
{System.out.println(a.getMessage()); } }});
Clear.addActionListener(new ActionListener(){
//此方法可以清楚文本框,方便填写
public void actionPerformed(ActionEvent e){
Address.setText("");
Name.setText("");
Work.setText("");
Phone.setText("");
});Check.addActionListener(new ActionListener(){
//此方法运用数据结构方法在链表里进行查找
public void actionPerformed(ActionEvent e){
LinkedList&People& list=new LinkedList&People&();
for(int k=0;k&=People.k++)
list.add(personSave[k]);
String iid=IDc.getText();
//把文本框的字符转为可以参加运算的整型数字
f=Integer.parseInt(iid);
People find=list.get(f-1);
String message="您要查找的人的信息是:"+"&"+find.getValue()+"\n";
Show.insert(message,Show.getDocument().getLength());
Delect.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
LinkedList&People& list=new LinkedList&People&();
for(int k=0;k&=People.k++)
list.add(personSave[k]);
String iid=IDc.getText();
d=Integer.parseInt(iid);
People delect=list.remove(d-1);
String message="您已经删除了的人的信息是:"+"&"+delect.getValue()+"\n";
Show.insert(message,Show.getDocument().getLength());
// People replace=list.set(d-1, new People("", "", "", "", ""));
//通过覆盖达到利用数据结构删除文件信息的功能
File f=new File("a.txt");
fileOut=new FileOutputStream(f);
objectOut=new ObjectOutputStream(fileOut);
catch(Exception a)
System.out.println(a);
for(int i2=0;i2&=People.i2++)
personSave[i2]=list.get(i2);
objectOut.writeObject(personSave[i2]);
catch (IOException e22) {
e22.printStackTrace();
public static void main(String args[])
new tongxunlu("通讯录");
手机防盗软件的兑现
手机防盗软件的实现
暑假第三十五天,今天学习的是手机防盗软件的实现过程,感觉这个软件也挺不错的,所以拿出来和大家一块分享一下,其实通过本程序你可以学到,如何注册一个账号,还有广播时间,发送短信等功能,嗯,最近呢,表示对电脑很烦,每天10个小时以上都在电脑旁,这样的日子,我们足足过了三十多天,最近感觉小有不适,眼睛貌似都有不舒服,再加上天热,哎!我们这群痛并着快乐的程序员们,不过这样是日子也快结束了,等到8月底,自己就可以放心的回家喽,那样天天没有电脑的日子,可以享受一个月再继续开学,嗯,想家ing...
... 嘿嘿,废话不多说了看看实现的过程吧
1,先看看布局
main.xml一个编辑框两个按钮
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/bg"
android:orientation="vertical" &
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" &
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="开始防盗" &
android:id="@+id/modify"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="修改密码" &
&/LinearLayout&
&/LinearLayout&2.password.xml 两个编辑框 ,两个按钮
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:id="@+id/username"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名:"
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" &
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 --&
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.
import android.app.A
import android.app.AlertD
import android.content.SharedP
import android.content.SharedPreferences.E
import android.os.B
import android.telephony.TelephonyM
import android.view.LayoutI
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.EditT
import android.widget.T
public class PhoneBakActivity extends Activity {
// 设置对话框
AlertDialog setPasswordD
// 显示对话框
AlertDialog showPasswordD
SharedPreferences sharedP
EditText et_
Button btn_
Button btn_
// o判断是否的第一次使用和是否已经开启防盗功能
boolean isF
boolean isS
// 获取手机SIM卡的信息
TelephonyManager telephonyM
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();
// 调用输入密码的方法
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();
// 得到保存的用户名和密码
String savedUsername = sharedPreferences.getString("username",
String savedPassword = sharedPreferences.getString("password",
// 如果用户名和密码相同的时候
if (username.trim().equals(savedUsername)
&& password.trim().equals(savedPassword)) {
// 调用init方法
// 取消输入密码的dialog
showPasswordDialog.dismiss();
Toast.makeText(PhoneBakActivity.this, "用户名或者密码错误,请重新输入",
Toast.LENGTH_LONG).show();
btn_cancle.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
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);
// 保存手机号到编辑器中
// 设置激活状态为true
et_safenumber.setEnabled(true);
btn_modify.setEnabled(true);
btn_start.setText("开始防盗");
// 获得输入的安全是手机号码
String safeNumber = et_safenumber.getText().toString();
// 当输入的手机号码为空的时候,提示一下
if (safeNumber.trim().equals("")) {
Toast.makeText(PhoneBakActivity.this, "安全号码不能为空,请重新设置",
Toast.LENGTH_LONG).show();
// 得到字符串的电话号码为1号线,对GSM手机MSISDN。。
String phoneNumber = telephonyManager.getLine1Number();
// IMSI可以区分SIM卡的标示
String subScribeerId = telephonyManager
.getSubscriberId();
// 保存手机号到数据文件中
Editor editor = sharedPreferences.edit();
editor.putString("safenumber", safeNumber);
editor.putBoolean("start", isStart);
editor.putString("subscriberid", subScribeerId);
// 设置激活状态为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();
// 获得编辑器
Editor editor = sharedPreferences.edit();
// 向编辑添加用户名和密码
editor.putString("username", username);
editor.putString("password", password);
// 改变first为flase
editor.putBoolean("first", false);
// 保存编辑好 的数据
// 取消设置密码的dialog
setPasswordDialog.dismiss();
btn_cancle.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (isFirst) {
setPasswordDialog.dismiss();
// 是在标题
builder.setTitle("设置密码");
// 构造view对象
builder.setView(view);
// 创建和显示对话框
setPasswordDialog = builder.create();
setPasswordDialog.show();
}4.接着看看开机的时候的处理bootReceiver.java获得开机后的广播事件
package com.
import java.util.L
import javax.net.ssl.ManagerFactoryP
import android.content.BroadcastR
import android.content.C
import android.content.I
import android.content.SharedP
import android.telephony.TelephonyM
import android.telephony.SmsM
public class bootReceiver extends BroadcastReceiver {
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) {
//获得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)) {
//获得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,
5.接着看发送短信的实现SMSReceiver.javapackage com.
import java.util.L
import android.content.BroadcastR
import android.content.C
import android.content.I
import android.content.SharedP
import android.telephony.SmsM
import android.telephony.SmsM
public class SMSReceiver extends BroadcastReceiver {
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. i++) {
puds[i] = (byte[]) objects[i];
// 每一条短信对象
SmsMessage[] message = new SmsMessage[objects.length];
for (int i = 0; i & puds. i++) {
// 创建一个SmsMessage从原始PDU。
message[i] = SmsMessage.createFromPdu(puds[i]);
for (int i = 0; i & message. 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("你捡到了我的手机,请归还,联系方式:0");
for (String msg : message1) {
// 发送短信到savephonenumber
smsManager.sendTextMessage(savephonenumber, null,
msg, null, null);
6.亲,别忘了添加权限和注册服务哦!!
&?xml version="1.0" encoding="utf-8"?&
&manifest xmlns:android="/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" &
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.然后呢,就可以看到运行结果咯,运行结果如下:第一张图片是第一次使用时候设置用户名和密码,第二张是向另一个自己的手机,发送丢失手机的信息
第三张是点击开始防盗是时候的时间,第四张是点击修改密码的时候的事件
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:}

我要回帖

更多关于 安卓2.3.5 re管理器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信