Java Smack Android,创建一个接收消息的服务

Java Smack Android,创建一个接收消息的服务,java,android,xmpp,chat,smack,Java,Android,Xmpp,Chat,Smack,我正在和图书馆smack Android 4.1.4聊天。该库使用XMPP协议。要接收消息,您必须向服务器(例如openfire)进行身份验证,并使用XMPPCONNECTION登录。如果在应用程序启动时执行,所有这些都非常简单。当您必须在应用程序关闭时接收消息时,就会出现问题。我尝试使用“Android服务”来维持客户端和服务器之间的连接。(在这种情况下我做到了)但我认为这不是最好的方法。另外,由于Android通过服务在手机关闭和再次打开时,服务不会自行重新启动,并且在手机关闭时收到的消息将

我正在和图书馆smack Android 4.1.4聊天。该库使用XMPP协议。要接收消息,您必须向服务器(例如openfire)进行身份验证,并使用XMPPCONNECTION登录。如果在应用程序启动时执行,所有这些都非常简单。当您必须在应用程序关闭时接收消息时,就会出现问题。我尝试使用“Android服务”来维持客户端和服务器之间的连接。(在这种情况下我做到了)但我认为这不是最好的方法。另外,由于Android通过服务在手机关闭和再次打开时,服务不会自行重新启动,并且在手机关闭时收到的消息将丢失。我附上代码Android。你有什么建议吗?。了解如何使用其他聊天应用程序,如whatsapp、badoo、facebook、Telegrame等,将非常有用

public class ServizioMessaggi extends Service {

public static final int NOTIFICATION_ID = 1;
static ChatManager chatmanager;
public static AbstractXMPPConnection connessione;
ConnettiServizio connetti;
MySQLiteHelper db;
String SharedPreferences = "Whisper";

public ServizioMessaggi() {
    super();
}

@Override
public void onCreate() {

    SharedPreferences sharedPref = getSharedPreferences(SharedPreferences, Context.MODE_PRIVATE);
    connetti = new ConnettiServizio();
    connetti.execute(sharedPref.getString("username",""),sharedPref.getString("password",""),"vps214588.ovh.net");
    db = new MySQLiteHelper(this);



    super.onCreate();
}



@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}


@Override
public void onDestroy() {
    super.onDestroy();
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

public class ConnettiServizio extends AsyncTask<String,String,String> {
    public AbstractXMPPConnection con;
    @Override
    protected String doInBackground(String... strings) {
        con = new XMPPTCPConnection(strings[0],strings[1],strings[2]);
        try {
            con.connect();
            con.login();
        } catch (SmackException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XMPPException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);

        connessione = con;

        con.addConnectionListener(new ConnectionListener() {
            @Override
            public void connected(XMPPConnection connection) {
                System.out.println("connected");
            }

            @Override
            public void authenticated(XMPPConnection connection, boolean resumed) {
                System.out.println("autenticathed");
            }

            @Override
            public void connectionClosed() {
                System.out.println("Connection Close");
            }

            @Override
            public void connectionClosedOnError(Exception e) {
                System.out.println("Connection Close whith error");
            }

            @Override
            public void reconnectionSuccessful() {
                System.out.println("reconnection ");
            }

            @Override
            public void reconnectingIn(int seconds) {

            }

            @Override
            public void reconnectionFailed(Exception e) {
                System.out.println("recconnection failed");
            }
        });

        ascolta();

    }
}

private void ascolta() {

    chatmanager = ChatManager.getInstanceFor(connetti.con);

        chatmanager.addChatListener(new ChatManagerListener() {


            public void chatCreated(final Chat chat, final boolean createdLocally) {

                Log.i("chat creata", "****************");

                chat.addMessageListener(new ChatMessageListener() {


                    public void processMessage(Chat chat, Message message) {



                        Log.i("messaggio arrivato", "****************");

                        //JOptionPane.showMessageDialog(null, "Rec: For " + chat.getParticipant() + " from " + message.getFrom() + "\n" + message.getBody());

                        String sender = message.getFrom();


                        System.out.println("Received message: " + (message != null ? message.getBody() : "NULL"));

                        NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

                        Intent notificationIntent = new Intent(ServizioMessaggi.this, Chat.class);

                        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                                | Intent.FLAG_ACTIVITY_SINGLE_TOP);

                        PendingIntent intent = PendingIntent.getActivity(ServizioMessaggi.this, 0,
                                notificationIntent, 0);

                        // scelta suoneria per notifica
                        Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

                        NotificationCompat.Builder mBuilder =
                                (NotificationCompat.Builder) new NotificationCompat.Builder(ServizioMessaggi.this)
                                        .setSmallIcon(R.drawable.ic_stat_notification)
                                        .setColor(Color.argb(0,0,176,255))
                                        .setTicker("Nuovo messaggio da " + message.getFrom())
                                        .setContentTitle(sender.substring(0,sender.indexOf("@")))
                                        .setContentText(message.getBody())
                                        .setContentIntent(intent)
                                        .setSound(sound);

                        // effettua la notifica
                        mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());




                        SimpleDateFormat s = new SimpleDateFormat("hh:mm:ss");
                        String ora = s.format(new Date());

                        //aggiungo il messaggio al database
                        Messaggio ms = new Messaggio();
                        ms.setUsername(message.getFrom().substring(0, message.getFrom().indexOf("/")));
                        ms.setIsmy("no");
                        ms.setTimestamp(ora);
                        ms.setMessaggio(message.getBody());
                        db.addMessaggio(ms);


                        if(ChatActivity.isvisible){

                            ((Activity)ChatActivity.c).runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    ChatActivity.updateListMessaggi();
                                }
                            });
                        } else {

                        }




                    }

                });

            }

        });


}


}
公共类服务扩展服务{
公共静态最终整数通知_ID=1;
静态聊天管理器;
公共静态抽象XMPP连接连接;
康内蒂塞维西奥·康内蒂;
MySQLiteHelper数据库;
字符串SharedReferences=“Whisper”;
公共服务Omessaggi(){
超级();
}
@凌驾
public void onCreate(){
SharedReferences SharedReferences=GetSharedReferences(SharedReferences,Context.MODE\u PRIVATE);
connetti=新的ConnettiServizio();
execute(sharedPref.getString(“用户名”),sharedPref.getString(“密码”),vps214588.ovh.net);
db=新的MySQLiteHelper(此);
super.onCreate();
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
返回开始时间;
}
@凌驾
公共空间{
super.ondestory();
}
@可空
@凌驾
公共IBinder onBind(意向){
返回null;
}
公共类ConnettiServizio扩展异步任务{
公共抽象XMPPCON;
@凌驾
受保护的字符串背景(字符串…字符串){
con=新的XMPPTCPConnection(字符串[0],字符串[1],字符串[2]);
试一试{
con.connect();
con.login();
}捕捉(SmackException e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}捕获(XMPPException e){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串s){
super.onPostExecute(s);
connessione=con;
con.addConnectionListener(新的ConnectionListener(){
@凌驾
连接的公共void(XMPPConnection){
System.out.println(“已连接”);
}
@凌驾
已验证的公共void(XMPPConnection连接,布尔恢复){
System.out.println(“自动验证”);
}
@凌驾
公共无效连接关闭(){
System.out.println(“连接关闭”);
}
@凌驾
public void connectionClosedOnError(异常e){
System.out.println(“连接关闭时出错”);
}
@凌驾
公共无效重新连接成功(){
System.out.println(“重新连接”);
}
@凌驾
公共无效重新连接IN(整数秒){
}
@凌驾
公共无效重新连接失败(异常e){
System.out.println(“重新连接失败”);
}
});
ascolta();
}
}
私人ascolta(){
chatmanager=chatmanager.getInstanceFor(connetti.con);
addChatListener(新的ChatManagerListener(){
已创建公共无效聊天室(最终聊天室,最终布尔值本地创建){
Log.i(“chat creata”,“****************”);
addMessageListener(新的ChatMessageListener(){
public void processMessage(聊天室、消息消息){
Log.i(“到达消息”,“****************”);
//JOptionPane.showMessageDialog(null,“Rec:For”+chat.getParticipant()+“from”+message.getFrom()+“\n”+message.getBody());
String sender=message.getFrom();
System.out.println(“收到的消息:+(消息!=null?消息.getBody():“null”);
NotificationManager mNotificationManager=(NotificationManager)getSystemService(通知服务);
Intent notificationIntent=新意图(ServizioMessaggi.this,Chat.class);
notificationIntent.setFlags(Intent.FLAG\u活动\u清除\u顶部
|意图。标记活动(单个顶部);
pendingent intent=pendingent.getActivity(ServizioMessaggi.this,0,
通知意图,0);
//每通知一份
Uri sound=RingtoneManager.getDefaultUri(RingtoneManager.TYPE_通知);
通知相容建筑商mBuilder=
(NotificationCompat.Builder)新的NotificationCompat.Builder(ServizioMessaggi.this)
.setSmallIcon(R.drawable.ic_stat_通知)
.setColor(Color.argb(0,0176255))
.setTicker(“Nuovo messaggio da”+message.getFrom())
.setContentTitle(发送方.substring(0,发送方.indexOf(“@”))
.setContentText(message.getBody())
.setContentIntent(intent)
.setSound(声音);
//notifica效应
mNotificationManager.notify(通知ID,mBuilder.buil