2013-02-22 10 views
5

基本的には、プロジェクト全体を実行するMainクラスがあります。アプリケーションが集中しなくなると、コードは完全に動作していますが、非アクティブになります。私はそれをサービスにする方法について私は思っていた。起動時に起動するもの。aSmack as a service

アプリは通知用の一方向メッセージシステムになります。 I.

デスクトップクライアント - > Openfireサーバ - > AndroidのXMPPサービス - >ストレージ(DB) - > AndroidのGUI表示

のための私が言ったように、コードが動作(接続、ログイン、受信)が、ISNされますサービスはありません。

私はBEEMソースを使用することができましたが、機能は豊富でインターレースもあります。私は軽量サービスの後です。

コード:

public class MainActivity extends Activity { 

    public static final String HOST = "fire.example.com"; 
    public static final int PORT = 5222; 
    public static final String SERVICE = "example.com"; 
    public static final String USERNAME = "[email protected]ample.com"; 
    public static final String PASSWORD = "mepass"; 

    private XMPPConnection connection; 
    private ArrayList<String> messages = new ArrayList<String>(); 
    private Handler mHandler = new Handler(); 
    private ListView listview; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    listview = (ListView) this.findViewById(R.id.listMessages); 
    setListAdapter(); 

    connect(); 
    } 

    /** 
    * Called by Settings dialog when a connection is establised with 
    * the XMPP server 
    */ 
    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("XMPPChatActivity ", " Text Recieved " + message.getBody() + " from " + fromName); 

      messages.add(message.getBody()); 


      mHandler.post(new Runnable() { 
       public void run() { 
       setListAdapter(); 
       } 
      }); 
      } 
     } 


     }, filter); 
    } 
    } 
    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
@SuppressLint("NewApi") 


    private void setListAdapter() { 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.listitem, messages); 
    listview.setAdapter(adapter); 
    } 

    @Override 
    protected void onDestroy() { 
    super.onDestroy(); 
    try { 
     connection.disconnect(); 
    } catch (Exception e) { 

    } 
    } 

    public void connect() { 

    final ProgressDialog dialog = ProgressDialog.show(this, "Connecting...", "Please wait...", false); 
    Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
     // Create a connection 
     ConnectionConfiguration connConfig = new ConnectionConfiguration(HOST, PORT, SERVICE); 
     XMPPConnection connection = new XMPPConnection(connConfig); 
     try { 
      connection.connect(); 
      Log.i("XMPPChatActivity", "[SettingsDialog] Connected to "+connection.getHost()); 
     } catch (XMPPException ex) { 
      Log.e("XMPPChatActivity", "[SettingsDialog] Failed to connect to "+ connection.getHost()); 
      Log.e("XMPPChatActivity", ex.toString()); 
      setConnection(null); 
     } 
      try { 
      connection.login(USERNAME, PASSWORD); 
      Log.i("XMPPChatActivity", "Logged in as" + connection.getUser()); 

      // Set the status to available 
      Presence presence = new Presence(Presence.Type.available); 
      connection.sendPacket(presence); 
      setConnection(connection); 

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

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

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

       Presence.Type type = entryPresence.getType(); 
       if (type == Presence.Type.available) 
       Log.d("XMPPChatActivity", "Presence AVIALABLE"); 
       Log.d("XMPPChatActivity", "Presence : " + entryPresence); 
       } 
       } catch (XMPPException ex) { 
       Log.e("XMPPChatActivity", "Failed to log in as "+ USERNAME); 
       Log.e("XMPPChatActivity", ex.toString()); 
       setConnection(null); 
       } 
       dialog.dismiss(); 
      } 
     }); 
    t.start(); 
    dialog.show(); 
    } 
} 

だから、基本的に、私はこの、彼らがサービスを利用として、あなたはGTalk SMSソースをチェックアウトすることができますが、AndroidのService Framework.

を利用する必要があるサービス

答えて

1

作るにはどうすればよいですオープンソースです。 (メインサービスは、接続などの処理に使用するサービスです)、非常に複雑です。

Androidでサービスを利用するための基本をチェックすることをお勧めします。

サービスは新しいスレッドを作成しないことを忘れないでください。すべてがUIスレッドで実行されますので、バックグラウンドで長時間実行するタスクを実行する場合は、asynctaskまたはexecutorサービスも実装する必要があります。

0

古い質問ですが、私はとにかく答えるでしょう。
サービスを作成して起動し、サービスではなく、スマート接続のコードをアクティビティで使用する必要があります。アプリはフォアグラウンドにいなくても接続は保持されます。私はクライアントのアプリケーションの1つでこのメソッドを使用しており、うまくいきます。

また、サービスでハンドラまたはAsyncTaskを使用して、別の非UIスレッドでソケット接続を作成することを確認してください。 Androidでは、UIスレッドで接続を作成することは許可されません。