2016-01-13 80 views
0

我正在使用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()); 
    } 
}; 

} 
+0

因此,运行意向服务的问题是什么 – Mohit

+0

如果应用程序在后台/前台运行,没有问题。如果我杀了应用程序,我没有收到消息。 – MinnuKaAnae

+0

运行一个'服务',并把你的意图在里面... – Mohit

回答

0

基本上service在您背景即使你的应用程序被终止运行。

只需拨打服务一样,

Intent chatService = new Intent(MainActivity.this,ChatService.class); 
startService(chatService); 
+0

我已经这样做了,但是当应用程序被终止时,我得到了onNetworkMainThreadException()。我发现背后的原因是我在服务中使用Web服务。 – MinnuKaAnae

+0

可以发布你的代码以获取更多帮助。 – 2016-01-13 12:21:01

+0

用代码编辑我的问题。请检查一次 – MinnuKaAnae

0

你应该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); 
1

您可以添加报警火每隔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> 
+0

您可以发布任何相关链接或代码 – MinnuKaAnae

+0

检查更新。 –

+0

非常感谢你的代码。我会尝试这一个 – MinnuKaAnae

0

尝试在onStartCommand添加startForeground,它会提高你的业务的优先级。但它应该伴随着通知的存在。

startForeground(int id, Notification notification) 
+0

我使用IntentService,所以如果我杀了应用程序OnStartCommand()将不会执行。那么,我该如何解决这个问题 – MinnuKaAnae

+0

当然,在你杀死你的应用程序之前,你必须新建并开始你的服务。然后,一旦你启动服务,它会OnStartCommand()。 –

+0

或尝试返回Service.START_STICKY; –

相关问题