所以在java,js开发过程中去掉尾部3位。
现摘在别人的如下:
第一个:
由于精度不同,导致长度不一致,直接转换错误。
JAVA时间戳长度是13位,如:1294890876859
PHP时间戳长度是10位, 如:1294890859
主要最后三位的不同,JAVA时间戳在PHP中使用,去掉后三位,如:1294890876859-> 1294890876 结果:2011-01-13 11:54:36
- echo date('Y-m-d H:i:s','1294890876');
PHP时间戳在JAVA中使用,最后加三位,用000补充,如:1294890859->1294890859000
结果:2011-01-13 11:54:19
- SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- String dateTime = df.format(1294890859000L);
- System.out.println(df);
第二个
由PHP传入JS处理的时间戳我说怎么老是对不上号呢,原来JS时间戳为13位,包含3位毫秒的,而PHP只有10位不包含毫秒的。看来得补补基础了。
附我的一个解决Comment发表时间的函数:
var nowtime = (new Date).getTime();/*当前时间戳*/
/*转换时间,计算差值*/
function comptime(beginTime,endTime){
var secondNum = parseInt((endTime-beginTime*1000)/1000);//计算时间戳差值
if(secondNum>=0&&secondNum<60){
return secondNum+'秒前';
}
else if (secondNum>=60&&secondNum<3600){
var nTime=parseInt(secondNum/60);
return nTime+'分钟前';
}
else if (secondNum>=3600&&secondNum<3600*24){
var nTime=parseInt(secondNum/3600);
return nTime+'小时前';
}
else{
var nTime = parseInt(secondNum/86400);
return nTime+'天前';
}
}
t = comptime(timestamp,nowtime);//timestamp为PHP通过ajax回传的时间戳
alert(t);
</script>
AIDL是Android的一种接口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成 AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象。
AIDL RPC机制是通过接口来实现的,类似Windows中的COM或者Corba,但他是轻量级的,客户端和被调用实现之间是通过代理模式实现的,代理类和被代理类实现同一个接口Ibinder接口。
下面是实现Activity访问Service例子的步骤:
一.创建.aidl文件
AIDL使用简单的语法来声明接口,描述其方法以及方法的参数和返回值。这些参数和返回值可以是任何类型,甚至是其他AIDL生成的接口。重要的是必须导入导入除了内建类型(例如:int,boolean等)外的任何其他类型,哪怕是这些类型是在与接口相同的包中。具体的要求如下:
- JAVA基本数据类型不需要导入
- String,List,Map和CharSequence不需要导入
使用Eclipse的ADT插件创建一个BookInfo.aidl文件,该文件有4个方法:
setName(String name)设置图书的书名,setPrice(int price)设置图书的价格,setPublish(String pname)设置图书的出版社和String display()显示图书的信息.
BookInfo.aidl文件
- package com.Android.aidl;
- //BookInfo接口
- interface BookInfo{
- void setName(String name);
- void setPrice(int price);
- void ssetPublish(String pname);
- //显示图书的信息
- String display();
- }
创建好BookInfo.aidl文件,系统会自动在gen目录下生成Java接口文件BookInfo.java
二.实现AIDL文件生成的JAVA接口
AIDL会生成一个和.aidl文件同名的JAVA接口文件,该接口中有一个静态抽象内部类Stub,该类中声明了AIDL文件中定义的所有方法,其中有一个重要的方法是asInterface(),该方法通过代理模式返回JAVA接口的实现我们可以定义一个实现类,BookImpl,该类继承Stub 类,实现我们定义的4个方法
- package com.Android.aidl;
- import Android.os.RemoteException;
- public class BookInfoImpl extends BookInfo.Stub {
- //声明三个个变量
- private int price;
- private String name,pname;
- //显示书名,价格,出版社
- public String display() throws RemoteException{
- return "书名:"+name+";价格:"+price+";出版社:"+price;
- }
- @Override
- //设置书名
- public void setName(String name) throws RemoteException {
- // TODO Auto
- this.name= name;
- }
- @Override
- //设置价格
- public void setPrice(int price) throws RemoteException {
- // TODO Auto-generated method stub
- this.price = price;
- }
- @Override
- //设置出版社
- public void setPublish(String pname) throws RemoteException {
- // TODO Auto
- this.pname= pname;
- }
- }
三.向客户端暴露接口
现在已经实现了BookInfo接口,接下来要将该接口暴露给客户端调用。一般通过定义一个Service来实现,在Service的onBind()方法中返回该接口,当我们绑定该接口时调用该方法。
- package com.Android.aidl;
- import com.Android.aidl.BookInfo.Stub;
- import Android.app.Service;
- import android.content.Intent;
- import Android.os.IBinder;
- public class RemoteService extends Service {
- //声明BookInfo接口
- private Stub bookifo = new BookInfoImpl();
- public IBinder onBind(Intent intent){
- return bookifo;
- }
- }
四.在客户端调用
定义一个Activity来绑定远程Service,获得BookInfo接口,通过RPC机制调用接口中的方法。
- package com.Android.aidl;
- import Android.app.Activity;
- import Android.app.Service;
- import android.content.ComponentName;
- import Android.content.Intent;
- import android.content.ServiceConnection;
- import Android.os.Bundle;
- import android.os.IBinder;
- import Android.os.RemoteException;
- import android.view.View;
- import Android.view.View.OnClickListener;
- import android.widget.Button;
- import Android.widget.Toast;
- public class MainActivity extends Activity {
- // 声明IPerson接口
- private BookInfo bookInfo;
- // 声明 Button
- private Button btn;
- // 实例化ServiceConnection
- private ServiceConnection conn = new ServiceConnection() {
- @Override
- synchronized public void onServiceConnected(ComponentName name, IBinder service) {
- // 获得IPerson接口
- bookInfo = BookInfo.Stub.asInterface(service);
- if (bookInfo != null)
- try {
- // RPC 方法调用
- bookInfo.setName("Google Android SDK开发范例大全");
- bookInfo.setPrice(55);
- bookInfo.setPublish("人民邮电出版社");
- String msg = bookInfo.display();
- // 显示方法调用返回值
- Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG)
- .show();
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- }
- @Override
- public void onServiceDisconnected(ComponentName name) {
- }
- };
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 设置当前视图布局
- setContentView(R.layout.main);
- // 实例化Button
- btn = (Button) findViewById(R.id.Button1);
- //为Button添加单击事件监听器
- btn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // 实例化Intent
- Intent intent = new Intent();
- // 设置Intent Action 属性
- intent.setAction("com.Android.aidl.action.MY_REMOTE_SERVICE");
- // 绑定服务
- bindService(intent, conn, Service.BIND_AUTO_CREATE);
- }
- });
- }
- }
五.main.xml和AndroidManifest.xml文件
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- Android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <Button
- Android:text="远程调用Service"
- android:id="@+id/Button1"
- Android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
- </LinearLayout>
在AndroidManifest.xml文件16~20声明Service
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:Android="http://schemas.android.com/apk/res/android"
- package="com.android.aidl"
- Android:versionCode="1"
- android:versionName="1.0">
- <uses-sdk Android:minSdkVersion="10" />
- <application Android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".MainActivity"
- Android:label="@string/app_name">
- <intent-filter>
- <action Android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <service Android:name="RemoteService">
- <intent-filter>
- <action Android:name="com.android.aidl.action.MY_REMOTE_SERVICE"/>
- </intent-filter>
- </service>
- </application>
- </manifest>
效果图:
一.Spinner的简介与创建 1.Spinner的简介
Spinner(下拉列表)是一个每次只能选择所有项中一项的控件,相当于Html中的下拉列表框。它的继承关系如下:
java.lang.Object
↳ Android.view.View
↳ Android.view.ViewGroup
↳ Android.widget.AdapterView<T extends android.widget.Adapter>
↳ Android.widget.AbsSpinner
↳ Android.widget.Spinner
Spinner常用的XML属性:
属性名称
描述
Android:prompt
该提示在下拉列表对话框显示时显示。(译者注:对话框的标题:

2.创建使用Spinner的步骤如下:
①需要在布局中定时Spinner组件,然后向Spinner添加需要选择的数据
②设置事件监听器setOnItemSelectedListener( )并实现onItemSelected( )
3.Spinner添加数据的两种方法:
①在Java代码中载入列表数据
具体的例子如下:
MainActivity.java
- package com.Android.spinner;
-
- import Android.app.Activity;
- import Android.os.Bundle;
- import Android.view.View;
- import Android.widget.AdapterView;
- import Android.widget.ArrayAdapter;
- import Android.widget.Spinner;
- import Android.widget.TextView;
-
- public class MainActivity extends Activity {
- private static final String[] province={"广东","广西","湖南","河南","福建"};
- private TextView text;
- private Spinner spinner;
- private ArrayAdapter<String> adapter;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- text=(TextView)findViewById(R.id.text);
- spinner=(Spinner)findViewById(R.id.spinner);
-
- //将Spinner里面的可选择内容通过ArrayAdapter连接起来
- adapter=new ArrayAdapter<String>(this,Android.R.layout.simple_spinner_item,province);
- //设置Spinner的样式
- adapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
- //为对话框设置标题
- //也可在XMl文件中通过“Android:prompt”设置
- spinner.setPrompt("你来自哪个省");
- //为Spinner设置适配器
- spinner.setAdapter(adapter);
- //添加Spinner事件监听
- spinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){
- @Override
- public void onItemSelected(AdapterView<?> arg0, View arg1,
- int arg2, long arg3) {
- // TODO Auto-generated method stub
- text.setText("你所在的城市是:"+province[arg2]);
- //设置显示当前选择的项
- arg0.setVisibility(View.VISIBLE);
- }
-
- @Override
- public void onNothingSelected(AdapterView<?> arg0) {
- // TODO Auto-generated method stub
- }
- });
- }
- }
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- Android:padding="10dip"
- android:layout_width="fill_parent"
- Android:layout_height="wrap_content"
- >
- <TextView
- Android:id="@+id/text"
- Android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- Android:layout_marginTop="10dip"
- android:text="@string/planet_prompt"
- />
- <Spinner
- Android:id="@+id/spinner"
- android:layout_width="fill_parent"
- Android:layout_height="wrap_content"
- />
- </LinearLayout>
strings.xml
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="planet_prompt">你来自的省份是:</string>
- <string name="app_name">测试Spinner</string>
- </resources>
效果图:


②在XML文件中定义列表的数据
具体的例子如下:
MainActivity.java
- package com.Android.spinner;
-
- import Android.app.Activity;
- import Android.os.Bundle;
- import android.view.View;
- import Android.widget.AdapterView;
- import android.widget.AdapterView.OnItemSelectedListener;
- import Android.widget.ArrayAdapter;
- import android.widget.Spinner;
- import Android.widget.Toast;
-
- public class MainActivity extends Activity {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Spinner spinner = (Spinner) findViewById(R.id.spinner);
- ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
- this, R.array.province,
- Android.R.layout.simple_spinner_item);
- //调用setDropDownViewResource方法,以XML的方式定义下拉菜单要显示的样式
- adapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
- //为spinner设置适配器
- spinner.setAdapter(adapter);
- spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
- }
-
- public class MyOnItemSelectedListener implements OnItemSelectedListener {
- public void onItemSelected(AdapterView<?> parent,View view, int pos, long id) {
- Toast.makeText(parent.getContext(), "你来自的省份是: " +
- parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();
- }
-
- public void onNothingSelected(AdapterView<?> parent) {
- // TODO Auto-generated method stub
- }
- }
- }
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- Android:padding="10dip"
- android:layout_width="fill_parent"
- Android:layout_height="wrap_content"
- >
- <TextView
- Android:id="@+id/text"
- Android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- Android:layout_marginTop="10dip"
- android:text="@string/planet_prompt"
- />
- <Spinner
- Android:id="@+id/spinner"
- android:layout_width="fill_parent"
- Android:layout_height="wrap_content"
- android:prompt="@string/planet_prompt"
- />
- </LinearLayout>
strings.xml
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="planet_prompt">你来自的省份是</string>
- <string name="app_name">测试Spinner</string>
- <string-array name="province">
- <item>广东</item>
- <item>广西</item>
- <item>湖南</item>
- <item>河南</item>
- <item>福建</item>
- </string-array>
- </resources>
效果图:

二.AutoCompleteTextView简介
我们平常上网的时候经常会用到Google或百度,在输入框中输入类似”51CTO“,和51CTO相关的信息就会被列出来,供用户选择,非常方便。这种效果在Android中是用AutoCompleteTextView实现的。在AutoCompleteTextView中,主要是设置想显示资源的适配器(Adapter)。
AutoCompleteTextView有三个重要的方法clearListSelection():清除选中的列表项、dismissDropDown():如果存在关闭下拉菜单、getAdapter():获取适配器。
具体的例子如下:
MainActivity.java
- package com.Android.autocomplete;
-
- import Android.app.Activity;
- import Android.os.Bundle;
- import android.widget.ArrayAdapter;
- import Android.widget.AutoCompleteTextView;
-
- public class MainActivity extends Activity {
- private AutoCompleteTextView atv;
- //创建字符串数组
- private static final String[] strs = {"an", "and", "Android", "abc","abcdef" };
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- atv = (AutoCompleteTextView) findViewById(R.id.AutoCompleteTextView1);
- //创建适配器
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
- Android.R.layout.simple_dropdown_item_1line, strs);
- //为AutoCompleteTextView设置适配器
- atv.setAdapter(adapter);
- }
- }
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- Android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- Android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- Android:text="自动完成文本框"
- />
- <AutoCompleteTextView
- Android:id="@+id/AutoCompleteTextView1"
- Android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- />
- </LinearLayout>
效果图:

如果是PHP做的服务端,要用Android去访问,如何办?当然可以用REST,但也可以用点笨的方法,比如PHP的服务端可以用JSON和XML提供返回的数据,而android端则可以用APACHE的httpclient去访问.
下面是一个例子,假设数据表中users表有如下字段(mysql):
idusers,UserName,FullName,加点数据.然后在服务端PHP,建立一个
webservice1.php,作用是直接返回服务端数据库的数据,如下:
- <?php
- if(isset($_GET['user']) && intval($_GET['user'])) {
- $format = strtolower($_GET['format']) == 'json' ? 'json' : 'xml'; //xml is the default
- $user_id = intval($_GET['user']); //no default
- /* 连接数据库*/
- $link = mysql_connect('localhost','root','xxxxx') or die('Cannot connect to the DB');
- mysql_select_db('jsonAndroid',$link) or die('Cannot select the DB');
- $query = "SELECT * FROM `users`;";
- $result = mysql_query($query,$link) or die('Errant query: '.$query);
- $posts = array();
- if(mysql_num_rows($result)) {
- while($post = mysql_fetch_assoc($result)) {
- $posts[] = array('post'=>$post);
- }
- }
- /* json格式*/
- if($format == 'json') {
- header('Content-type: application/json');
- echo json_encode(array('posts'=>$posts));
- }
- else {
- header('Content-type: text/xml');
- echo '<posts>';
- foreach($posts as $index => $post) {
- if(is_array($post)) {
- foreach($post as $key => $value) {
- echo '<',$key,'>';
- if(is_array($value)) {
- foreach($value as $tag => $val) {
- echo '<',$tag,'>',htmlentities($val),'</',$tag,'>';
- }
- }
- echo '</',$key,'>';
- }
- }
- }
- echo '</posts>';
- }
- }
- ?>
则可以把数据表输出为JSON或者XML格式了.客户端的Android调用:
- try {
- HttpParams httpParams = new BasicHttpParams();
- HttpConnectionParams.setConnectionTimeout(httpParams,
- TIMEOUT_MILLISEC);
- HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);
- HttpParams p = new BasicHttpParams();
- p.setParameter("user", "1");
- HttpClient httpclient = new DefaultHttpClient(p);
- String url = "http://10.0.2.2:8082/myphp/phpWebservice/webservice1.php?user=1&format=json";
- HttpPost httppost = new HttpPost(url);
- try {
- Log.i(getClass().getSimpleName(), "send task - start");
- List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
- 2);
- nameValuePairs.add(new BasicNameValuePair("user", "1"));
- httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
- ResponseHandler<String> responseHandler = new BasicResponseHandler();
- String responseBody = httpclient.execute(httppost,
- responseHandler);
- // 解析JSON返回的 JSONObject json = new JSONObject(responseBody);
- JSONArray jArray = json.getJSONArray("posts");
- ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
- for (int i = 0; i < jArray.length(); i++) {
- HashMap<String, String> map = new HashMap<String, String>();
- JSONObject e = jArray.getJSONObject(i);
- String s = e.getString("post");
- JSONObject jObject = new JSONObject(s);
- map.put("idusers", jObject.getString("idusers"));
- map.put("UserName", jObject.getString("UserName"));
- map.put("FullName", jObject.getString("FullName"));
- mylist.add(map);
- }
- Toast.makeText(this, responseBody, Toast.LENGTH_LONG).show();
再搞个webservice2.php,该文件用来把客户端传送过去的JSON数据保存
- <?php
- $json = file_get_contents('php://input');
- $obj = json_decode($json);
- //echo $json;
- //保存数据库
- $con = mysql_connect('localhost','root','XXX') or die('Cannot connect to the DB');
- mysql_select_db('jsonAndroid',$con);
- mysql_query("INSERT INTO `users` (UserName, FullName)
- VALUES ('".$obj->{'UserName'}."', '".$obj->{'FullName'}."')");
- mysql_close($con);
- $posts = array(1);
- header('Content-type: application/json');
- echo json_encode(array('posts'=>$posts));
- ?>
而Android端的,可以构造JSON,发送到webservice2.php
- try {
- JSONObject json = new JSONObject();
- json.put("UserName", "test2");
- json.put("FullName", "1234567");
- HttpParams httpParams = new BasicHttpParams();
- HttpConnectionParams.setConnectionTimeout(httpParams,
- TIMEOUT_MILLISEC);
- HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);
- HttpClient client = new DefaultHttpClient(httpParams);
- String url = "http://10.0.2.2:8082//myphp/phpWebservice/webservice2.php";
- HttpPost request = new HttpPost(url);
- request.setEntity(new ByteArrayEntity(json.toString().getBytes(
- "UTF8")));
- request.setHeader("json", json.toString());
- HttpResponse response = client.execute(request);
- HttpEntity entity = response.getEntity();
- if (entity != null) {
- InputStream instream = entity.getContent();
- String result = RestClient.convertStreamToString(instream);
- Log.i("Read from server", result);
- Toast.makeText(this, result,
- Toast.LENGTH_LONG).show();
- }
这样,就可以把Android发送的数据保存到服务端了。





