如何运行意向服务甚至应用程序被杀害/销毁
我正在使用IntentService
实施基于聊天的应用程序。现在我需要获得消息,即使应用程序不在后台。很明显,我想要的是我需要运行意向服务,如果应用程序不处于后台状态。如何运行意向服务甚至应用程序被杀害/销毁
public class ChatService extends IntentService {
JabberSmackAPI c = null;
XMPPConnection connection;
@Override
public void onCreate() {
super.onCreate();
System.out.println("chatservice------onCreate-----");
}
@Override
public int onHandleIntent(Intent arg0) {
System.out.println("--chat services--");
try {
setUp(c);
} catch (XMPPException e) {
// TODO Auto-generated catch block
System.out.println("--XMPPConnection error--chat service--");
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("--IOException error--chat service--");
e.printStackTrace();
}
return super.onStartCommand(intent, flags, startId);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void setUp(JabberSmackAPI c) throws XMPPException, IOException {
// declare variables
c = new JabberSmackAPI();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String msg = "hi how r u!";
// Enter your login information here
c.login(chat_id, GlobalDeclaration.paswword);
System.out.println("-----");
String talkTo = "username";
}
public class JabberSmackAPI implements MessageListener, ChatManagerListener {
public void login(String userName, String password) throws XMPPException {
ConnectionConfiguration config = new ConnectionConfiguration("Host", 5222);
connection = new XMPPConnection(config);
connection.connect();
PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
connection.addPacketListener(packetListener, filter);
connection.login(userName, password);
}
}
private PacketListener packetListener = new PacketListener() {
public void processPacket(Packet packet) {
// TODO Auto-generated method stub
System.out.println("In the process packet");
System.out.println(packet.toXML());
Intent broadcastIntent = new Intent();
broadcastIntent.setAction("FILE_DOWNLOADED_ACTION");
getBaseContext().sendBroadcast(broadcastIntent);
System.out.println("---final packrt result-- " + packectResult.trim());
}
};
}
基本上service
在您背景即使你的应用程序被终止运行。
只需拨打服务一样,
Intent chatService = new Intent(MainActivity.this,ChatService.class);
startService(chatService);
我已经这样做了,但是当应用程序被终止时,我得到了onNetworkMainThreadException()。我发现背后的原因是我在服务中使用Web服务。 – MinnuKaAnae
可以发布你的代码以获取更多帮助。 – 2016-01-13 12:21:01
用代码编辑我的问题。请检查一次 – MinnuKaAnae
你应该startService和bindService 如果您只使用bindService,它将一旦你离开类丧生。 StartService将保持您的服务活着。
如下:
Intent intentService = new Intent(MainActivity.this, MyService.class);
startService(intentService);
bindService(new Intent(MainActivity.this, MyService.class),MainActivity.this, BIND_AUTO_CREATE);
您可以添加报警火每隔X时间,这个报警触发服务。解决方案1:警报 - 呼叫 - > BroadcastReceiver - 消防(开始) - >您的服务。解决方案2:任何系统BroadcastReceiver(例如电池电量变化) - >您的服务。
-----更新-------
public class BaseNotificationManager extends BroadcastReceiver {
public static final String BaseAction = "Com.TST.BaseAction";
public static final String FireService = "Com.TST.FireNotificationAction";
private static final long timeFrame = 1000*60*5; // 5 mints
public BaseNotificationManager() {
}
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
/// add base alarm manager
startBaseAlarmManager(context);
}else if (BaseAction.equals(intent.getAction())){
// StartYourService();
}
} public static void startBaseAlarmManager (Context context){
AlarmManager alarmMgr;
PendingIntent alarmIntent;
alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, BaseNotificationManager.class);
intent.setAction(BaseAction);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
5000, timeFrame, alarmIntent);
}}
清单
<receiver
android:name=".BaseNotificationManager"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
尝试在onStartCommand添加startForeground,它会提高你的业务的优先级。但它应该伴随着通知的存在。
startForeground(int id, Notification notification)
我使用IntentService,所以如果我杀了应用程序OnStartCommand()将不会执行。那么,我该如何解决这个问题 – MinnuKaAnae
当然,在你杀死你的应用程序之前,你必须新建并开始你的服务。然后,一旦你启动服务,它会OnStartCommand()。 –
或尝试返回Service.START_STICKY; –
因此,运行意向服务的问题是什么 – Mohit
如果应用程序在后台/前台运行,没有问题。如果我杀了应用程序,我没有收到消息。 – MinnuKaAnae
运行一个'服务',并把你的意图在里面... – Mohit