Java 即使应用程序关闭,仍保持服务活动

Java 即使应用程序关闭,仍保持服务活动,java,android,Java,Android,我已经找过了,但什么也没找到。我的问题是:当应用程序关闭时,如何使我的服务不关闭。我有一个聊天应用程序,所以我需要即使在应用程序关闭时,该服务也会一直监听消息 我试过了 android:process=":my_process" 但这导致该服务类似于main的“独立应用程序”,因此无法识别我发送的任何东西 当然,我也不希望我的服务受到约束 public class MyService extends Service { public static final String HOST = "1

我已经找过了,但什么也没找到。我的问题是:当应用程序关闭时,如何使我的服务不关闭。我有一个聊天应用程序,所以我需要即使在应用程序关闭时,该服务也会一直监听消息

我试过了

 android:process=":my_process"
但这导致该服务类似于main的“独立应用程序”,因此无法识别我发送的任何东西

当然,我也不希望我的服务受到约束

public class MyService extends Service {
public static final String HOST = "192.168.1.102";
  public static final int PORT = 5222;
  public static final String SERVICE = "reza-hp";
  public static final String USERNAME = "reza";
  public static final String PASSWORD = "pro";
  private ArrayList<String> messages = new ArrayList<String>();
  private Handler mHandler = new Handler();


  //public static Handler mHandler = new Handler();
public static  ConnectionConfiguration connConfig = new   
ConnectionConfiguration(HOST, PORT, SERVICE);
public static XMPPConnection connection = new XMPPConnection(connConfig);  
  //  ArrayList<String> messages = XMPPChatDemoActivity.messages; 

  @Override
public IBinder onBind(Intent intent) {

    return null;
}
// @Override
// public void onCreate() {
//  connect();  
//  setConnection(connection);
//this must be called again on reconnect
};

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub

BusProvider.getInstance().register(this);

 connect();


return START_STICKY;
}







public void connect() {


//  if (connection != null) {
//   final ProgressDialog dialog = ProgressDialog.show(this, "Connecting...", 
"Please wait...", false);
Thread t = new Thread(new Runnable() {
  @Override
  public void run() {
    // Create a connection
     try {
       connection.connect();
       Log.i("XMPPChatDemoActivity",  "[SettingsDialog] Connected to  
"+connection.getHost());
     } catch (XMPPException ex) {
         Log.e("XMPPChatDemoActivity",  "[SettingsDialog] Failed to connect to "+ 

connection.getHost());
         Log.e("XMPPChatDemoActivity", ex.toString());

    }


     try {
          if (!connection.isAuthenticated()) {

        connection.login(USERNAME, PASSWORD);
        Log.i("XMPPChatDemoActivity",  "Logged in as" + connection.getUser());
          }
        // Set the status to available
        Presence presence = new Presence(Presence.Type.available);
        try {
            connection.sendPacket(presence);
        } catch (NotYetConnectedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Roster roster = connection.getRoster();
        Collection<RosterEntry> entries = roster.getEntries();
        for (RosterEntry entry : entries) {

          Log.d("XMPPChatDemoActivity",  "--------------------------------------");
          Log.d("XMPPChatDemoActivity", "RosterEntry " + entry);
          Log.d("XMPPChatDemoActivity", "User: " + entry.getUser());
          Log.d("XMPPChatDemoActivity", "Name: " + entry.getName());
          Log.d("XMPPChatDemoActivity", "Status: " + entry.getStatus());
          Log.d("XMPPChatDemoActivity", "Type: " + entry.getType());
          Presence entryPresence = roster.getPresence(entry.getUser());

          Log.d("XMPPChatDemoActivity", "Presence Status: "+ 
 entryPresence.getStatus());
          Log.d("XMPPChatDemoActivity", "Presence Type: " + entryPresence.getType());

          Presence.Type type = entryPresence.getType();

          if (type == Presence.Type.available)
            Log.d("XMPPChatDemoActivity", "Presence AVIALABLE");
            Log.d("XMPPChatDemoActivity", "Presence : " + entryPresence);
          }
          } catch (XMPPException ex) {
            Log.e("XMPPChatDemoActivity", "Failed to log in as "+  USERNAME);
            Log.e("XMPPChatDemoActivity", ex.toString());

          }
   //       dialog.dismiss();
  }


  });
BusProvider.getInstance().post(new ButtonEvent());
t.start();
//  dialog.show();


}




 public void setConnection(XMPPConnection connection) {
this.connection = connection;
if (connection != null) {
  // Add a packet listener to get messages sent to us
  PacketFilter filter = new MessageTypeFilter(Message.Type.chat);

  connection.addPacketListener(new PacketListener() {
 @Override
     public void processPacket(Packet packet) {
      Message message = (Message) packet;
      if (message.getBody() != null) {
        String fromName = StringUtils.parseBareAddress(message.getFrom());
        Log.i("XMPPChatDemoActivity ", " Text Recieved " + message.getBody() + " from  
 " +  fromName);
        messages.add(fromName + ":");
        messages.add(message.getBody());
        Log.i("XMPPChatDemoActivity",message.getBody());
        mHandler.post(new Runnable() {
          public void run() {
    //        setListAdapter();
          }
        });
      }
    }
   }, filter);

  }
 }





}
公共类MyService扩展服务{
公共静态最终字符串HOST=“192.168.1.102”;
公共静态最终int端口=5222;
公共静态最终字符串服务=“reza hp”;
公共静态最终字符串USERNAME=“reza”;
公共静态最终字符串PASSWORD=“pro”;
private ArrayList messages=new ArrayList();
私有处理程序mHandler=新处理程序();
//公共静态处理程序mHandler=新处理程序();
公共静态连接配置connConfig=new
连接配置(主机、端口、服务);
公共静态XMPPConnection连接=新的XMPPConnection(connconconfig);
//ArrayList messages=XMPPChatDemoActivity.messages;
@凌驾
公共IBinder onBind(意向){
返回null;
}
//@覆盖
//public void onCreate(){
//connect();
//设置连接(连接);
//必须在重新连接时再次调用此命令
};
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
//TODO自动生成的方法存根
BusProvider.getInstance().register(此);
connect();
返回开始时间;
}
公共void connect(){
//if(连接!=null){
//final ProgressDialog dialog=ProgressDialog.show(此“连接…”),
“请稍等……”,错);
线程t=新线程(新的可运行线程(){
@凌驾
公开募捐{
//创建连接
试一试{
connection.connect();
Log.i(“XMPPChatDemoActivity”,“[SettingsDialog]已连接到
“+connection.getHost());
}捕获(XMPPException-ex){
Log.e(“XMPPChatDemoActivity”,“[SettingsDialog]无法连接到”+
connection.getHost());
Log.e(“XMPPChatDemoActivity”,例如toString());
}
试一试{
如果(!connection.isAuthenticated()){
连接。登录(用户名、密码);
Log.i(“XMPPChatDemoActivity”,“以“+connection.getUser()登录”);
}
//将状态设置为“可用”
状态=新状态(Presence.Type.available);
试一试{
连接。发送数据包(存在);
}捕获(NotYetConnectedException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
花名册=connection.get花名册();
集合条目=花名册.getEntries();
对于(排班条目:条目){
Log.d(“XMPPChatDemoActivity”,即“---------------------------------------------”);
Log.d(“XMPPChatDemoActivity”、“RosterEntry”+条目);
Log.d(“XMPPChatDemoActivity”,“User:+entry.getUser());
Log.d(“XMPPChatDemoActivity”,“Name:+entry.getName());
Log.d(“xmppchatdomactivity”,“Status:+entry.getStatus());
Log.d(“XMPPChatDemoActivity”,“Type:+entry.getType());
Presence entryPresence=花名册.getPresence(entry.getUser());
Log.d(“XMPPChatDemoActivity”,“状态:”+
getStatus());
Log.d(“XMPPChatDemoActivity”,“状态类型:”+entryPresence.getType());
Presence.Type=entryPresence.getType();
if(type==Presence.type.available)
Log.d(“XMPPChatDemoActivity”、“状态可访问”);
Log.d(“XMPPChatDemoActivity”、“Presence:+entryPresence”);
}
}捕获(XMPPException-ex){
Log.e(“XMPPChatDemoActivity”,“以“+用户名”登录失败);
Log.e(“XMPPChatDemoActivity”,例如toString());
}
//dialog.dismise();
}
});
BusProvider.getInstance().post(新按钮事件());
t、 start();
//dialog.show();
}
公共无效设置连接(XMPPConnection连接){
这个连接=连接;
if(连接!=null){
//添加数据包侦听器以获取发送给我们的消息
PacketFilter=newmessagetypefilter(Message.Type.chat);
addPacketListener(新的PacketListener(){
@凌驾
公共无效处理数据包(数据包){
消息消息=(消息)数据包;
if(message.getBody()!=null){
String fromName=StringUtils.parseBareAddress(message.getFrom());
Log.i(“XMPPChatDemoActivity”,“Text received”+message.getBody()+”来自
“+fromName);
messages.add(fromName+“:”);
messages.add(message.getBody());
Log.i(“XMPPChatDemoActivity”,message.getBody());
mHandler.post(新Runnable(){
公开募捐{
//setListAdapter();
}
});
}
}
},过滤器);
}
}
}
粘性服务

这将使服务在被另一个进程终止后自动启动

试试下面

@Override
public int onStartCommand(Intent intent, int flags, int startId) { 
    // We want this service to continue running until it is explicitly stopped, so return sticky.       
   return START_STICKY;
 }
有关更多信息,请阅读文档:


希望这有帮助

我添加了这个,但是当我关闭应用程序时,服务也会关闭,我也会注销。你是如何关闭应用程序的?即使你手动关闭运行Stick的服务,它也会再次出现。需要显示更多代码。我最后使用了onback键,它更适合messenger应用程序,我不想要它麻烦的是,我会在后面放一个退出按钮。不管怎样,我现在发布完整的代码,如果你仔细研究一下,那将是我的荣幸。这是正确的方法吗?在后台持续运行服务是一个巨大的资源消耗器。你需要某种中间存储来存储可能会定期检查的消息从你的应用程序中创建一个IntentService,然后更新本地数据库和/或通知用户等待消息。不过我以前从未编写过聊天应用程序。