Android后台服务和唤醒锁

编程入门 行业动态 更新时间:2024-10-25 05:26:53
本文介绍了Android后台服务和唤醒锁的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我有android后台服务与我的RabbitMQ服务器连接.我的后台服务监听传入的Rabbitmq消息.一切工作正常,但问题在屏幕关闭时出现.手机屏幕熄灭时,我的android客户端断开连接.我该怎么做才能始终与我的android Rabbitmq客户端和Rabbitmq服务器连接?

I have android background service to connect with my RabbitMQ server. My background service listen incoming rabbitmq message. Everything is working well but the problem is appear while screen goes off. My android client disconnect when phone screen goes off. What should I do to always connected with my android rabbitmq client and rabbitmq server ?

我的代码如下:

public class RabbitmqPushService extends Service{ private Thread subscribeThread; private ConnectionFactory factory; private Connection connectionSubscribe; private Channel channelSubscribe; private NotificationManager mNotificationManager; public static int NOTIFICATION_ID = 0; private static final String HOST_NAME = Constant.HOST_NAME; //Rabbitmq Host Name private static final int PORT_ADDRESS = 5672; private static final String EXCHANGE_NAME = "fanout_msg"; private static String QUEUE_NAME = Constant.phone_number+"_queue"; //Queue Name private static String[] ROUTE_KEY = {"all", Constant.phone_number}; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { NOTIFICATION_ID = 0; setupConnectionFactory(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { if(connectionSubscribe != null) { if(!connectionSubscribe.isOpen()) { connect(); } } else { connect(); } return Service.START_STICKY; } @Override public void onDestroy() { if(connectionSubscribe != null) { disconnectSubscribe(); } NOTIFICATION_ID = 0; } private void setupConnectionFactory() { factory = new ConnectionFactory(); factory.setHost(HOST_NAME); factory.setPort(PORT_ADDRESS); factory.setUsername(Constant.USERNAME); factory.setPassword(Constant.PASSWORD); factory.setRequestedHeartbeat(60); } private void connect() { final Handler incomingMessageHandler = new Handler() { @Override public void handleMessage(Message msg) { String message = msg.getData().getString("msg"); try { JSONObject jsonObject = new JSONObject(message); BeepHelper.msgBeep(getApplicationContext()); sendNotification("From : " + jsonObject.getString("from"), jsonObject.getString("message")); } catch (JSONException e) { e.printStackTrace(); } } }; subscribe(incomingMessageHandler); publishToAMQP(); } private void disconnectSubscribe() { subscribeThread.interrupt(); try { channelSubscribe.close(); connectionSubscribe.close(); } catch (IOException e) { e.printStackTrace(); } catch (TimeoutException e) { e.printStackTrace(); } } void subscribe(final Handler handler) { subscribeThread = new Thread() { @Override public void run() { while(true) { try { connectionSubscribe = factory.newConnection(); channelSubscribe = connectionSubscribe.createChannel(); channelSubscribe.exchangeDeclare(EXCHANGE_NAME, "fanout"); channelSubscribe.queueDeclare(QUEUE_NAME, true, false, false, null); for(int i = 0; i<ROUTE_KEY.length; i++) { channelSubscribe.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTE_KEY[i]); } QueueingConsumer consumer = new QueueingConsumer(channelSubscribe); channelSubscribe.basicConsume(QUEUE_NAME, false, consumer); while (true) { QueueingConsumer.Delivery delivery = consumer.nextDelivery(); String message = new String(delivery.getBody()); Message msg = handler.obtainMessage(); Bundle bundle = new Bundle(); bundle.putString("msg", message); msg.setData(bundle); handler.sendMessage(msg); channelSubscribe.basicAck(delivery.getEnvelope().getDeliveryTag(), false); } } catch (InterruptedException e) { break; } catch (Exception e1) { try { Thread.sleep(4000); //sleep and then try again } catch (InterruptedException e) { break; } } } } }; subscribeThread.start(); } @Override public void publishMessage(String message) { try { queue.putLast(message); } catch (InterruptedException e) { e.printStackTrace(); } } private void sendNotification(String title, String msg) { mNotificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE); PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, new Intent(getApplicationContext(), MainActivity.class), 0); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext()) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle(title) .setStyle(new NotificationCompat.BigTextStyle() .bigText(msg)) .setContentText(msg); mBuilder.setContentIntent(contentIntent); mNotificationManager.notify(NOTIFICATION_ID++, mBuilder.build()); }

}

推荐答案

您需要一个唤醒锁,以在屏幕关闭时保持手机运行.唤醒锁使您的应用程序可以控制主机设备的电源状态.

You need a Wake Lock to keep the phone running when screen is off. Wake locks allow your application to control the power state of the host device.

将WAKE_LOCK权限添加到应用程序的清单文件中:

Add the WAKE_LOCK permission to your application's manifest file:

<uses-permission android:name="android.permission.WAKE_LOCK" />

然后在 onCreate()中添加以下内容:

Then add the following in onCreate():

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); wakelock= pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getCanonicalName()); wakelock.acquire();

更多推荐

Android后台服务和唤醒锁

本文发布于:2023-11-27 09:30:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1637522.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:后台   Android

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!