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" ); } }