【网学网提醒】:网学会员,鉴于大家对android学习日记十分关注,会员在此为大家搜集整理了“android学习日记”一文,供大家参考学习!
android学习日记
【2012.7.10】
正常关闭Android应用
程序:(linuxidc/Linux/2012-06/64055.htm)
当应用不再使用时,通常需要关闭应用,可以使用以下三种方法关闭Android应用:
第一种方法:首先获取当前进程的id,然后杀死该进程。
Android.os.Process.killProcess(android.os.Process.myPid())
通过这种方式不能将应用
程序完全杀死,并且他不会把当前应用应用的Activity的task任务栈清空
第二种方法:终止当前正在运行的Java虚拟机,导致
程序终止
System.exit(0);
不会把自己的应用
程序杀死
第三种方法:强制关闭与该包有关联的一切执行
ActivityManagermanager=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
manager.restartPackage(getPackageName());
只能杀死别人,不能杀死自己
企业中做法:
创建类app继承Application
AndroidMainfest-->name-->app//声明该类为整个应用
程序全局的实例
创建整个应用
程序全局的实例
App.class:
ArrayList
activities;
其他的Activity中:
publicvoidonCreate(BundlesavedInstanceState)
{
Appapp=(App)getApplication();//获取应用程序全局的实例引用
app.activities.add(this);//把当前Activity放入集合中
}
publicvoidonDestory()
{
Appapp=(App)getApplication();//获取应用程序全局的实例引用
app.activities.remove(this);//把当前Activity从集合中移除
}
安全退出:
在菜单退出按钮的事件中定义如下代码:
Appapp=(App)getApplication();
Listactivities=app.activities;
for(Activityact:activities)
{
act.finish();//显式结束
}
【2012.7.11】
Socket通信
1.UDP实现(DatagramSocket)
【客户端】
//首先创建一个DatagramSocket对象
DatagramSocketsocket=newDatagramSocket(4567);
//创建一个InetAddress
InetAddressserverAddress=InetAddress.getByName("192.168.1.104");
Stringstr="hello";//这是要传输的数据
bytedata[]=str.getBytes();//把传输内容分解成字节
//创建一个DatagramPacket对象,并指定要讲这个数据包发送到网络当中的哪个、地址,以及端口号
DatagramPacketpacket=newDatagramPacket(data,data.length,serverAddress,4567);
//调用socket对象的send方法,发送数据
socket.send(packet);
【服务器端】
//创建一个DatagramSocket对象,并指定监听的端口号
DatagramSocketsocket=newDatagramSocket(4567);
bytedata[]=newbyte[1024];
//创建一个空的DatagramPac
ket对象
DatagramPacketpacket=newDatagramPacket(data,data.length);
//使用receive方法接收客户端所发送的数据,
//如果客户端没有发送数据,该进程就停滞在这里
socket.receive(packet);
Stringresult=newString(packet.getData(),packet.getOffset(),packet.getLength());
2.TCP通信
【客户端】
创建一Socket对象并指明服务器端的IP及端口号
Socketsocket=newSocket("192.168.1.0",45678);
//向服务器发送消息
PrintWriterout=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);
out.println(message);
//从服务器接收消息
BufferedReaderis=newBufferedReader(newInputStreamReader(socket.getInputStream()));
StringrString=is.readLine().toString();
【服务器端】
//创建一个ServerSocket对象,并让这个Socket在45678端口监听
serverSocket=newServerSocket(45678);
//调用ServerSocket的accept()方法,接受客户端所发送的请求,
//如果客户端没有发送数据,那么该线程就停滞不继续
Socketsocket=serverSocket.accept();
//从Socket当中得到InputStream对象
InputStreaminputStream=socket.getInputStream();
bytebuffer[]=newbyte[1024*4];
inttemp=0;
//从InputStream当中读取客户端所发送的数据
while((temp=inputStream.read(buffer))!=-1)
{
Stringstr=newString(buffer,0,temp);
//接下来可以对从客户端接收到的消息做处理
}
【Socket获取客户端IP地址及端口号】
Socket类包含一些非常有用的属性,这些属性允许确定关于正在连接的客户端的信息。其中关键信息之一
是返回EndPoint对象的RemoteEndPoint属性。EndPoint类本身是抽象的,要想收集有用的信息,需·要把
EndPoint强制类型转换为IPEndPoint对象。IPEndPoint类包含远程客户端的IP地址和端口号。具体用法如下:
TcpListenertcpl=newTcpListener(port);
Sockets=tcpl.AcceptSocket();
label1.text=((IPEndPoint)s.RemoteEndPoint).Address.ToString();
label2.text=((IPEndPoint)s.RemoteEndPoint).Port.ToString();
【2012.7.12】
1.TimerTask和Timer的应用
TimerTasktask=newTimerTask()
{
@Override
publicvoidrun()//不能直接执行(1)
{
//TODOAuto-generatedmethodstub
Messagemessage=newMessage();
message.what=1;
handler.sendMessage(message);
}
};
Timertimer=newTimer();
timer.schedule(task,1000,1000);//延迟1秒后,每秒执行一次
finalHandlerhandler=newHandler()
{
publicvoidhandleMessage(Messag
emsg)
{
switch(msg.what)
{
case1:
textView.setText(""+binder.getCount());//(1)
break;
}
super.handleMessage(msg);
}
};
2.service
【2012.7.13】
BroadcastReceiver使用
Broadcast分为:
普通广播(NormalBroadcast):完全异步,可以在同一时刻被所有接受者接收到,消息传递效率较高,
但不能将处理结果传递给下一个接受者,也不能终止广播。
有序广播(OrderedBroadcast):接受者按声明的优先级一次接收消息,优先级的声明在
元素的android:priority属性中,数越大优先级越高,取值范围-1000~+1000.也可以用IntentFilter对象的setPriority
()进行设置。接受者可以终止消息的传递,一旦中止,后边的接收者将无法接收到消息。优先接收到的接受者可以通过
setResultExtras(Bundle)方法将处理结果存入Broadcast中,然后传递给下一个接受者,下一个接受者通过代码:Bundle
bundle=getResultExtrals(true)可以获取上一个接受者存入的数据。
sendBroadcast()发送NormalBroadcast
sendOrderedBroadcast()发送OrderedBroadcast
//设置优先级权限
//一个简单的例子
publicclassmyReceiverextendsBroadcastReceiver
{
@Override
publicvoidonReceive(Contextcontext,Intentintent){
//TODOAuto-generatedmethodstub
Toast.makeText(context,"firstbroadcast",Toast.LENGTH_SHORT).show();
}
}
publicclassBroadcastActivityextendsActivity
{
/**Calledwhentheactivityisfirstcreated.*/
Buttonbutton;
@Override
publicvoidonCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button=(Button)findViewById(R.id.Start);
button.setOnClickListener(newButton.OnClickListener()
{
@Override
publicvoidonClick(Viewv)
{
//TODOAuto-generatedmethodstub
Intentintent=newIntent(BroadcastActivity.this,
myReceiver.class);
sendBroadcast(intent);
}
});
}
}
【2012.7.14】
SharedPreferences
SharedPreferences本身是一个接口无法获取SharedPreferences实例,只能通过Context提供的getSharedPreferences(Stringname,intmode)
方法获取。mode的值:
MODE_PRIVATE(本应用程序读写)
MODE_WORLD_READABLE(能被其他应用程序读,但不能写)
MODE_WORLD_WRITEBALE(能被其他应用程序读写)
SharedPreferences本身没有读写能力,通过调用其内部接口完成。SharedPreferences调用edit()方法获取它所对应的Edit对象
。Edit提供了一
下方法来向SharedPreferences读写数据:clear();putXxx(Stringkey,Xxxvalue);remove(Stringkey);commit();
SharedPreferencespreference=getSharedPreferences("share",MODE_PIVATE);//数据以xml格式存储,share为xml文件名
SharedPreferences.Editoreditor=preference.edit();
写数据:
editor.putString("str","text");//将text存在str中
editor.putInt("num",12345);将12345存在num中
//存储完毕,提交所有存入的数据
editormit();
读数据:
Stringstring=preference.getString("str",null);
intn=preference.getInt("num",0);
SharedPreferences将数据文件写在手机内存私有的目录/data/data/···中
【2012.7.15】
创建带图片的toast
Toasttoast=Toast.makeText(this,Text,Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER,0,0);
//获取Toast提示里原有的View
Viewtoastview=toast.getView();
//创建一个imageView
ImageViewimage=newImageView(this);
image.setImageResource(R.drawable.img);
//创建一个LinearLayout容器
LinearLayoutLay=newLinearLayout(this);
//向LinearLayout中添加图片和原有的View
Lay.addView(image);
Lay.addView(toastview);
toast.setView(Lay);
toast.show();
【2012.7.16】
update(Stringtable,ContentValuesvalues,StringwhereClause,String[]whereArgs)
Conveniencemethodforupdatingrowsinthedatabase.//方便的方法更新数据库中的行
table数据库的表名
values用来更新数据的ContentValue的对象
whereClause用来指定更新的行,一般为“_id=?”,若为null,所有的行均被更新
whereArgswhere语句中表达式的?占位参数列表,参数只能为String类型,当为1时,用new
String[]{Integer.toString(1)},表示_id=1的那行改变数据
SQLiteDatabasedb=getWritableDatabase();
ContentValuescv=newContentValues();
cv.put(IDCODE,id);
cv.put(NAME,name);
cv.put(SEX,sex);
intflag=db.update(T_NAME,cv,ID+"=?",
newString[]{Integer.toString(_id)});//更新成功返回1,否则返回0;
sql语句:
db.execSQL("update"+T_NAME
+"sets_id=?,s_name=?,s_sex=?where_id=?",newObject[]{
id,name,sex,Integer.toString(_id)});
【2012.7.27】
Android手机检查是否和无线连接
方法一:此方法既可以检查手机连接也可以检查手机无线连接状态。
ConnectivityManagermanager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfoinfo=manager.getActiveNetworkInfo();
if(info!=null&;&;info.isConnected()){
returntrue;
}else{
returnfalse;
}
方法二:此方法只能检查手机连接状态,不能检查手机无线连接状态(即:如果手机没手机卡,但是无线有连接
,也会返回false)
TelephonyManagermanager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
intstate=manager.getDataState();
if(state==TelephonyManager.DATA_CONNECTED){
returntrue;
}else{
returnfalse;
}
【2012.7.30】
不同Activity之间的转换
ComponentNamecomp=newComponentName(this,secondActivity.class);
Intentintent=newIntent();
intent.setComponent(comp);
startActivity(intent);//不需要在中配置
【2012.7.31】
publicvoidaddTo()
{
ContentResolvercontent=getContentResolver();
/*取得通讯簿的Cursor*/
contactCursor=content.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
PEOPLE_PROJECTION,null,null,"");
/*将Cursor传入自实现的ContactsAdapter*/
myContactsAdapter=newContactsAdapter(this,contactCursor);
Cursorc=myContactsAdapter.getCursor();
for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
Stringnumber=c
.getString(c
.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
Stringname=c
.getString(c
.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
nameDB.insert(number,name,null);
}
}
publicStringCompare(Stringnum)
{
Stringname="";
ContentResolvercontent=getContentResolver();
/*取得通讯簿的Cursor*/
contactCursor=content.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
PEOPLE_PROJECTION,null,null,"");
/*将Cursor传入自实现的ContactsAdapter*/
myContactsAdapter=newContactsAdapter(this,contactCursor);
Cursorc=myContactsAdapter.getCursor();
for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
//num不以86开头的普通号码,num.subString(3)截去86,num.subString(5)飞信
if(num.equals(c.getString(c
.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)))
||(num.substring(3))
.equals(c.getString(c
.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)))
||(num.substring(5))
.equals(c.getString(c
.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)))){
name=c.getString(c
.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
}
}
returnname;
}
【2012.8.3】
应用返回时保存数据,重启时再读取
protectedvoidonPause()
{
//TODOAuto-generatedmethodstub
super.onPause();
this.getPreferences(MODE_PRIVATE).edit()
.putString("name",namEditText.getText().toString())mit();
this.getPreferences(MODE_PRIVATE).edit()
.putString("num",numEditText.getText().toString())mit();
this.getPreferences(MODE_PRIVATE).edit()
.p
utString("other",otherEditText.getText().toString())
mit();
}
@Override
protectedvoidonResume(){
//TODOAuto-generatedmethodstub
super.onResume();
namEditText.setText(this.getPreferences(MODE_PRIVATE).getString("name",
null));
numEditText.setText(this.getPreferences(MODE_PRIVATE).getString("num",
null));
otherEditText.setText(this.getPreferences(MODE_PRIVATE).getString(
"other",null));
}
【2012.8.4】
自定义Dialog
android:layout_height="wrap_content"android:layout_width="wrap_content"
android:background="#ffffffff"android:orientation="horizontal"
android:id="@+id/dialog">
android:layout_width="wrap_content"
android:id="@+id/tvname"android:text=":"/>
android:layout_width="wrap_content"android:id="@+id/etname"android:minWidth="100dip"/>
2.调用代码
LayoutInflaterinflater=getLayoutInflater();
Viewlayout=inflater.inflate(R.layout.dialog,
(ViewGroup)findViewById(R.id.dialog));
newAlertDialog.Builder(this).setTitle("自定义布局").setView(layout)
.setPositiveButton("确定",null)
.setNegativeButton("取消",null).show();
RadioDialog
publicAlertDialog.BuildersetSingleChoiceItems(CharSequence[]items,intcheckedItem,DialogInterface.OnClickListenerlistener)
items列表项目
checkedItem所选中项目的id,-1表示没有选择
listener对列表和button监听
finalCharSequence[]items={"北京","上海","天津"};
newAlertDialog.Builder()
.setTitle("PickaCity")
..setSingleChoiceItems(items,-1,
newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intposition){
Toast.makeText(getApplicationContext(),
position+"->"+items[position],
Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
【2012.08.5】
Debug技术
断点->debugas
F5。F6。F7
F6执行下一步
runtoline执行到光标所在的地方