2013-02-22 2 views
5

기본적으로 전체 프로젝트를 실행하는 Main 클래스가 있습니다. 앱이 집중되지 않으면 코드가 비활성 상태가 되더라도 코드는 완벽하게 작동합니다. 나는 그 서비스를 만드는 방법에 대해 궁금해하고 있었다. 하나는 부팅시 시작할 것입니다.aSmack as service

앱은 알림을위한 편도 메시지 시스템입니다. I.E.

데스크톱 클라이언트 ->의 Openfire 서버 -> 안드로이드 XMPP 서비스 -> 스토리지 (DB)는 - 안드로이드 GUI 내가 말했듯 표시

를 들어, 코드가 작동> (Connect는, 로그인, 수신)하지만 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]"; 
    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(); 
    } 
} 

가, 어떻게이

답변

1

당신은 안드로이드 Service Framework.

을 활용해야하는 서비스를 만들 수 있죠 당신은 GTalk SMS 소스를 확인할 수 있습니다 오픈 소스입니다. (주 서비스는 연결을 처리하는 데 사용하는 서비스 등입니다.) 또한 매우 복잡합니다.

Android에서 서비스를 사용하는 기본 사항을 확인해 보시기 바랍니다.

서비스가 새 스레드를 생성하지 않는다는 것을 기억하십시오. UI 스레드에서 모든 작업이 계속 수행되므로 백그라운드에서 장기간 실행되는 작업을 수행하려면 asynctask 또는 executor 서비스도 구현해야합니다.

0

이전 질문이지만 어쨌든 내 답을 입력하겠습니다.
서비스를 생성하고 시작하고 서비스 내에서 아무런 활동이 아닌 스맥 연결 코드를 입력해야합니다. 앱이 포 그라운드에 있지 않아도 서비스는 연결을 유지합니다. 내 클라이언트의 응용 프로그램 중 하나에서이 방법을 사용하고 있으며 훌륭하게 작동합니다.

또한 서비스의 핸들러 또는 AsyncTask를 사용하여 다른 비 UI 스레드에서 소켓 연결을 생성해야합니다. Android에서는 UI 스레드에서 연결을 만들 수 없습니다.