mqtt 怎么实现android以后台service的方式获取gps数据,并定时发送到服务器
1 从Service继承一个类。
2 创建startService()方法。
3 创建endService()方法 重载onCreate方法和onDestroy方法,并在这两个方法里面来调用startService以及endService。
4 在startService中,通过getSystemService方法获取ContextLOCATION_SERVICE。
5 基于LocationListener实现一个新类。默认将重载四个方法onLocationChanged、onProviderDisabled、onProviderEnabled、onStatusChanged。对于onLocationChanged方法是我们更新最新的GPS数据的方法。一般我们的操作都只需要在这里进行处理。
6 调用LocationManager的requestLocationUpdates方法,来定期触发获取GPS数据即可。在onLocationChanged函数里面可以实现我们对得到的经纬度的最终操作。
7 最后在我们的Activity里面通过按钮来启动Service,停止Service。
示意代码如下:
package comoffbyegpsservice;
import androidappService;
import androidcontentContext;
import androidcontentIntent;
import androidlocationLocationListener;
import androidlocationLocationManager;
import androidosBinder;
import androidosIBinder;
import androidutilLog;
public class GPSService extends Service {
// 2000ms
private static final long minTime = 2000;
// 最小变更距离10m
private static final float minDistance = 10;
String tag = thistoString();
private LocationManager locationManager;
private LocationListener locationListener;
private final IBinder mBinder = new GPSServiceBinder();
public void startService() {
locationManager = (LocationManager) getSystemService(ContextLOCATION_SERVICE);
locationListener = new GPSServiceListener();
locationManagerrequestLocationUpdates(LocationManagerGPS_PROVIDER, minTime, minDistance,
locationListener);
}
public void endService() {
if (locationManager != null && locationListener != null) {
locationManagerremoveUpdates(locationListener);
}
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return mBinder;
}
android里面,通过json数据是不会直接返回的,只会返回的url地址。
步骤: 1,通过解析json数据,获取到的地址。
2,通过的地址,再一次的请求网络(用异步任务或者hangdler里面请求网络:比如:
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) urlopenConnection();
BufferedInputStream is = new BufferedInputStream(conngetInputStream());
)
3 通过BitmapFactorydecodeStream(里面的参数是一个字节流),该方法返回的是一个bitmap ,直接用imageviewsetimagebitmap()就能展示了。
说明: 在BitmapFactorydecodeStream这里返回的bitmap可以做进一步的优化,比如二次采样,把获取的bitmap存sd卡等等。。
为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),前者用于初次使用软件时生成数据库表。
后者用于升级软件时更新数据库表结构。当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。
onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2,并且在onUpgrade()方法里面实现表结构的更新。
当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。
Android 客户端代码:
package comltbSCActivity;
import javaioBufferedReader;
import javaioBufferedWriter;
import javaioIOException;
import javaioInputStreamReader;
import javaioOutputStreamWriter;
import javaioPrintWriter;
import javanetSocket;
import androidappActivity;
import androidosBundle;
import androidosHandler;
import androidosMessage;
import androidutilLog;
import androidviewView;
import androidviewViewOnClickListener;
import androidwidgetButton;
import androidwidgetEditText;
import androidwidgetTextView;
public class SCActivity extends Activity {
private TextView mRecvText = null;
private EditText mSentText = null;
private Button mSendRecvButton = null;
private Socket mSocket = null;
/ Called when the activity is first created /
@Override
public void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutmain);
mRecvText = (TextView)findViewById(RidrecvText);
mSentText = (EditText)findViewById(RidsentText);
mSendRecvButton = (Button)findViewById(RidsendRecvButton);
mSendRecvButtonsetOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String sentMessage = mSentTextgetText()toString() + "\r\n";
try {
mSocket = new Socket("1012638155", 12577);
Logi("------SCActivity---before send---", sentMessage);
PrintWriter send = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mSocketgetOutputStream())));
sendprintln(sentMessage);
sendflush(); //Important!!!!!!
//sendwrite(sentMessage);
Logi("------SCActivity---after send---", sentMessage);
BufferedReader recv = new BufferedReader(new InputStreamReader(mSocketgetInputStream()));
Logi("------SCActivity---Before ---recvreadLine()---", sentMessage);
String recvMsg = recvreadLine();
Logi("------SCActivity---after ---recvreadLine()---", recvMsg);
if (recvMsg != null) {
mRecvTextsetText(recvMsg);
} else {
mRecvTextsetText("Cannot receive data correctly");
}
sendclose();
recvclose();
mSocketclose();
} catch (Exception ex) {
exprintStackTrace();
}
}
});
}
服务器端代码:
import javaioBufferedReader;
import javaioBufferedWriter;
import javaioInputStreamReader;
import javaioOutputStreamWriter;
import javaioPrintWriter;
import javanetServerSocket;
import javanetSocket;
public class Server implements Runnable {
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(12577);
while (true) {
Socket client = serverSocketaccept();
Systemoutprintln("accept");
try {
BufferedReader in = new BufferedReader(new InputStreamReader(clientgetInputStream()));
String str = inreadLine();
Systemoutprintln("read:" + str);
PrintWriter pout = new PrintWriter(new BufferedWriter(new OutputStreamWriter(clientgetOutputStream())), true);
//poutwrite("Server Received Message: " + str);
poutprintln("Server Received Message: " + str);
Systemoutprintln("after send in server");
/ BufferedReader in = new BufferedReader(new InputStreamReader(clientgetInputStream()));
String str = inreadLine();
Systemoutprintln("read:" + str);/
poutclose();
inclose();
} catch (Exception e) {
Systemoutprintln(egetMessage());
eprintStackTrace();
} finally {
clientclose();
Systemoutprintln("close");
}
}
} catch (Exception e) {
Systemoutprintln(egetMessage());
}
}
public static void main(String argv[] ) {
Thread pcServerThread = new Thread(new Server());
pcServerThreadstart();
}
}
0条评论