package cn.edu.njupt.allgo.service;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;
import com.alibaba.fastjson.JSON;
import com.lidroid.xutils.DbUtils;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.DbException;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.RequestParams;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest;
import cn.edu.njupt.allgo.R;
import cn.edu.njupt.allgo.activity.HomeACTIVITY;
import cn.edu.njupt.allgo.activity.LogOffACTIVITY;
import cn.edu.njupt.allgo.application.MyDeclare;
import cn.edu.njupt.allgo.util.NetUtil;
import cn.edu.njupt.allgo.vo.UnreadVo;
import de.tavendo.autobahn.WebSocketConnection;
import de.tavendo.autobahn.WebSocketConnectionHandler;
import de.tavendo.autobahn.WebSocketException;
import de.tavendo.autobahn.WebSocketOptions;
import android.app.AlarmManager;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.SystemClock;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.Toast;
public class PullService extends Service{
private static final String TAG = "Service" ;
private boolean isRuning = false ; //程序是否运行
private MyDeclare declare;
private NotificationManager mNotificationManager;
private WebSocketConnection wsc = new WebSocketConnection();;
class pullThread implements Runnable {
@Override
public void run() {
pullWebSocket(); //WebSocket连接
while(isRuning){
if(NetUtil.isNetworkConnected(PullService.this)&&!wsc.isConnected()){
wsc.reconnect();
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
if(wsc.isConnected()){
wsc.disconnect();
}
Log.i(TAG, "run方法结束");
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO 自动生成的方法存根
return null;
}
@Override
public void onCreate() {
// TODO 自动生成的方法存根
super.onCreate();
Log.i(TAG,"onCreate===>PullService");
IntentFilter filter = new IntentFilter();
filter.addAction("cn.edu.njupt.allgo.service.PullService");
registerReceiver(TimeReceiver, filter);
declare =(MyDeclare)this.getApplicationContext();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO 自动生成的方法存根
int action = intent.getIntExtra("action", 0);
Log.i(TAG,"onStartCommand==>PullService==>"+action);
switch(action){
case 1: //用户登录开始实时推送
isRuning = true;
stopAlarm();
pullAction();
break;
case 2: //用户退出
isRuning = false ;
if(wsc.isConnected()){
wsc.disconnect();
}
break;
case 3: //开启后台推送
startAlarm();
break;
case 4: //关闭后台推送
stopAlarm();
break;
}
return START_STICKY;
}
//开启实时推送
private void pullAction(){
new Thread(new pullThread()).start();
}
private void pullWebSocket(){
// TODO 使用WebSocket实时推送
SharedPreferences sharedPref = this.getSharedPreferences("appdata",Context.MODE_PRIVATE);
List<BasicNameValuePair> headers = new ArrayList<BasicNameValuePair>();
headers.add(new BasicNameValuePair("Cookie","JSESSIONID="+sharedPref.getString("SessionId", "")));
/*SharedPreferences sharedPref1 = this.getSharedPreferences("userdata",Context.MODE_PRIVATE);
headers.add(new BasicNameValuePair("uid",sharedPref1.getInt("uid", -1)+""));*/
try {
wsc.connect("ws"+declare.getHost_url().substring(4)+"pull.ws", null, new WebSocketConnectionHandler(){
@Override
public void onClose(int code, String reason) {
Log.i(TAG, "onClose reason="+reason);
}
@Override
public void onOpen() {
Log.i(TAG, "后台推送已连接");
}
//接收文本消息
@Override
public void onTextMessage(String payload) {
readingParse(payload);
}
}, new WebSocketOptions(), headers);
} catch (WebSocketException e) {
e.printStackTrace();
}
}
//解析收到的String数据
private void readingParse(String reading) {
Log.i(TAG, "Service==>"+reading);
JSONObject jsonObject;
try {
jsonObject = new JSONObject(reading);
if(jsonObject.getString("response").equals("remind_unread")){
List<UnreadVo> unreadDate = new ArrayList<UnreadVo>();
unreadDate = JSON.parseArray(jsonObject.getString("remind_unread") , UnreadVo.class);
if(unreadDate.size() > 0){
try{
SharedPreferences sharedPref = this.getSharedPreferences("userdata",Context.MODE_PRIVATE);
int uid = sharedPref.getInt("uid", -1) ;
DbUtils db = DbUtils.create(this,uid + ".db");
db.configAllowTransaction(true);
db.configDebug(true);
db.saveAll(unreadDate);
Log.i(TAG, "db.saveAll(unreadDate)==>"+unreadDate.toString());
}catch(DbException e){
Log.e("DB", "error :" + e.getMessage() + "\n");
}
Intent intent = new Intent(this,HomeACTIVITY.class);
intent.putExtra("action", 1);
notifications(intent);
Intent intent2 = new Intent();
intent2.setAction("cn.edu.njupt.allgo.HomeACTIVITY");
intent2.putExtra("action", 2);
sendBroadcast(intent2);
}
}else if(jsonObject.getString("response").equals("notlogin")){
//把登录过期的消息发给HomeACTIVITY,由它处理
Intent intent = new Intent();
intent.setAction("cn.edu.njupt.allgo.HomeACTIVITY");
intent.putExtra("action", 1);
sendBroadcast(intent);
}else if(jsonObject.getString("response").equals("error")){
Toast.makeText(this, jsonObject.getJSONObject("error").getString("text"), Toast.LENGTH_SHORT).show();
}
} catch (JSONException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
}
}
public void notifications(Intent intent){
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setAutoCancel(true)
.setContentTitle("有新消息");
PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) ;
mBuilder.setContentIntent(resultPendingIntent);
mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(1001, mBuilder.build());
}
@Override
public void onDestroy() {
// TODO 自动生成的方法存根
Log.i(TAG,"onDestroy==>PullService");
stopAlarm();
unregisterReceiver(TimeReceiver);
super.onDestroy();
}
public BroadcastReceiver TimeReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.i(TAG, "getAction==>TimeReceiver" );
int message = intent.getIntExtra("message", 0);
if (action.equals("cn.edu.njupt.allgo.service.PullService")||action=="cn.edu.njupt.allgo.service.PullService") {
takeAction(message);
}
}
};
//broadcast的动作
private void takeAction(int message){
switch(message){
case 1: //轮询一次
if(NetUtil.isNetworkConnected(this)){
getOnePull();
}
break;
}
}
//后台轮询一次数据
private void getOnePull() {
SharedPreferences sharedPref = this.getSharedPreferences("userdata",Context.MODE_PRIVATE);
RequestParams params = new RequestParams();
params.addQueryStringParameter("uid", sharedPref.getInt("uid", -1) + "");
SharedPreferences sharedPref1 = this.getSharedPreferences("appdata",Context.MODE_PRIVATE);
params.addHeader("Cookie","JSESSIONID="+sharedPref1.getString("SessionId", ""));
HttpUtils http = new HttpUtils();
http.send(HttpRequest.HttpMethod.GET,
declare.getHost_url() + "remind/unread",
params,
new RequestCallBack<String>() {
@Override
public void onStart() {
Log.i(TAG ,"Pull==>onStart" ) ;
}
@Override
public void onLoading(long total, long current, boolean isUploading) {
}
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
readingParse(responseInfo.result);
}
@Override
public void onFailure(HttpException error, String msg) {
Log.i(TAG ,"Pull==>error==>" + msg ) ;
}
});
}
private void stopAlarm(){
AlarmManager alarm=(AlarmManager)getSystemService(ALARM_SERVICE);
Intent intent =new Intent("cn.edu.njupt.allgo.service.PullService");
PendingIntent sender=PendingIntent
.getBroadcast(PullService.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarm.cancel(sender);
Log.i(TAG, "PullService==>alarm.cancel" );
}
private void startAlarm(){
Intent intent =new Intent("cn.edu.njupt.allgo.service.PullService");
intent.putExtra("message", 1);
PendingIntent sender=PendingIntent
.getBroadcast(PullService.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
//开始时间
long firstime=SystemClock.elapsedRealtime();
AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);
//3分钟一个周期,不停的发送广播
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP
, firstime, 1*20*1000, sender);
Log.i(TAG, "PullService==>startAlarm" );
}
}