想要实现这个功能,应该分为三部分工作。
(1)定时功能的实现,调用系统当前时间,使用timer实现定时功能;
(2)当前位置的获取,使用GPS功能获取当前位置,并且显示出经度和纬度,并且使用位置监听事件LocationListener监听位置变化,当位置改变时,获取新的经纬度,并显示;
(3)将两部分功能进行整合为一个整体。
代码如下:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.text.method.DateTimeKeyListener;
import android.view.Menu;
import android.widget.TextView;
import android.widget.Toast;
public class TimerActivity extends Activity {
private Handler handler = new Handler();
Timer timer;
Timer timerone;
TimerTask task = new TimerTask() {// 任务
public void run() {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
TimerTask taskone = new TimerTask() {// 任务
public void run() {
Message message = new Message();
message.what = 0;
handler.sendMessage(message);
}
};
String g_latLongString;
@SuppressLint("HandlerLeak")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
timer = new Timer(true);
timer.schedule(task, 0, 5000); // 延时1000ms后执行,1000ms执行一次
timerone = new Timer(true);
timerone.schedule(taskone, 0, 1000); // 延时1000ms后执行,1000ms执行一次
// timer.cancel(); //退出计时器
// 通过系统服务,取得LocationManager对象
//声明LocationManager对象
LocationManager loctionManager;
String contextService=Context.LOCATION_SERVICE;
//通过系统服务,取得LocationManager对象
loctionManager=(LocationManager) getSystemService(contextService);
//通过GPS位置提供器获得位置
// String provider=LocationManager.GPS_PROVIDER;
// Location location = loctionManager.getLastKnownLocation(provider);
//使用标准集合,让系统自动选择可用的最佳位置提供器,提供位置
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);//高精度
criteria.setAltitudeRequired(false);//不要求海拔
criteria.setBearingRequired(false);//不要求方位
criteria.setCostAllowed(true);//允许有花费
criteria.setPowerRequirement(Criteria.POWER_LOW);//低功耗
//从可用的位置提供器中,匹配以上标准的最佳提供器
String provider = loctionManager.getBestProvider(criteria, true);
//获得最后一次变化的位置
Location location = loctionManager.getLastKnownLocation(provider);
//显示在TextView中
updateWithNewLocation(location);
//监听位置变化,2秒一次,距离10米以上
loctionManager.requestLocationUpdates(provider, 50000, 2, locationListener);
handler = new Handler() {// 委托
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
try {
TextView recordLoctionText = (TextView)findViewById(R.id.recordLoctionText);
recordLoctionText.append(g_latLongString + "n");
} catch (Exception e) {
Toast.makeText(getApplicationContext(), e.toString(),
Toast.LENGTH_SHORT).show();
}
break;
case 0:
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date curDate = new Date(System.currentTimeMillis());// 获取当前时间
String str = formatter.format(curDate);
TextView mytimeText = (TextView)findViewById(R.id.mytimeText);
mytimeText.setText(str );
}
}
};
}
//位置监听器
private final LocationListener locationListener = new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
updateWithNewLocation(null);
}
//当位置变化时触发
@Override
public void onLocationChanged(Location location) {
//使用新的location更新TextView显示
updateWithNewLocation(location);
}
};
// 将位置信息显示在TextView中
private void updateWithNewLocation(Location location) {
String latLongString;
TextView myLoctionText;
myLoctionText = (TextView) findViewById(R.id.myLoctionText);
if (location != null) {
double lat = location.getLatitude();
double lng = location.getLongitude();
latLongString = "Lat(纬度): " + lat + "nLong(经度): " + lng;
g_latLongString = latLongString;
} else {
latLongString = "没找到位置";
}
// SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
// Date curDate = new Date(System.currentTimeMillis());// 获取当前时间
// String str = formatter.format(curDate);
myLoctionText.setText( "您当前的位置是:n" + latLongString);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.timer, menu);
return true;
}
}
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" >
<TextView
android:id="@+id/mytimeText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
android:textSize="22dip" />
<TextView
android:id="@+id/myLoctionText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
android:textSize="22dip" />
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="none" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="vertical" >
<TextView
android:id="@+id/recordLoctionText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fadeScrollbars="false"
android:scrollbars="vertical"
android:text=""
android:textColor="#333333"
android:textSize="22dip" />
</LinearLayout>
</ScrollView>
</LinearLayout>