2012-01-23 3 views
3

私は次のようなシナリオを持っています: 私はチャットクライアントのように動作するアプリケーションを書いています。開始時にサーバーに接続し、メッセージをリスンします(ネットワークのものはサービスによって処理されます)。 私の問題はサインオフしてから数秒後です(関連するメソッドがサーバーに信号を送り、サービスを停止してfinish()を呼び出す)、アプリケーションは何もせずにサインオンしたように見えます(これはサーバーで見ることができます)ログ)。私はこの問題をどのように処理するのか分かりません。つまり、私のアプリがバックグラウンドで再びサインオンすることを妨げることです。 サインオンメソッドは、メインアクティビティのonCreateメソッドで作成されたサービスによって呼び出されます。私はまだアンドロイドに精通していないし、誰かが私にヒントを与えることができることを願っています。 ありがとうございます。そこに、 と私は「XXXXミリ秒で墜落したサービスのスケジューリングの再起動」 initNetwork方法とタイマークラスのようなメッセージが短縮され得るlogcatで認識:コードのアクティビティがバックグラウンドで何かをするのを防ぐ

よろしく、 sMau

編集追加自動サービスの再起動のために自動的に実行されたくない非常に多くのネットワークのものです。

public class NetworkService extends Service { 

public static String path; 
static ClientUserConfig myConfig; 
private ChatKeys keys; 

static Frontend_CS front_cs; 
static Frontend_CK front_ck; 

public static Boolean runOnce = true; 

private String server_ip = "10.0.2.2"; 

private static PPAClientActivity MAIN_ACTIVITY; 
private int serverConnectionTimer; 

private HashedWheelTimer timer; 

private final LinkedList<String> chatWindows = new LinkedList<String>(); 


class TimedChecksAndroid implements TimerTask { 

     public void run(Timeout tmt) { 
      String senderEmail; 
      String senderFullname; 
      LinkedList<String> list; 
      int selection; 
      int chatNum; 

      ClientUserEntry user; 

      if (serverConnectionTimer>=60){ 



} 





@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 
@Override 
public void onDestroy() { 

    super.onDestroy(); 


    shutdownService(); 

    if (MAIN_ACTIVITY != null) { 
     MAIN_ACTIVITY.showMessages(Consts.SERVICE_STOPPED); 
    } 
} 

private void shutdownService() { 

    Log.d("SERVICENET", "Shutdown reached."); 

    if(NetworkService.front_cs.getServer_handler() != null) { 
     Log.d("SERVICENET", "IF Block Sign OFF reached."); 
     LinkedList<String> list = new LinkedList<String>(); 
     list.add(NetworkService.myConfig.getEmail()); 
     NetworkService.front_cs.getServer_handler().sendMessage(new UniversalContainerMessage(ppa.utils.Constants.CS_GOING_OFFLINE_OPCODE,list)); 
    } 

} 
@Override 
public void onCreate() { 

    Log.d("SERVICENET", "Service creation started."); 

    super.onCreate(); 

    path = getExternalFilesDir(null).getAbsolutePath().toString() + "/"; // TODO erzeugt manchmal nullpointer? 


    initNetwork(); 

    if (MAIN_ACTIVITY != null) { 
     MAIN_ACTIVITY.showMessages(Consts.SERVICE_STARTED); 
    } 

} 



private void initNetwork() { 

    String fullname = null; 
    String email = null; 
    boolean cfgBuildSuccess = true; 



    serverConnectionTimer = 0; 
    timer = new HashedWheelTimer(); 
    timer.newTimeout(new TimedChecksAndroid(), ppa.utils.Constants.CHATCLIENT_CHECK_INTERVAL, TimeUnit.MILLISECONDS); 
    //schedular = new SchedularDialog(this, false, myConfig, front_cs); 

} 

public String getPath() { 
    return path; 
} 

public static void setMainActivity(PPAClientActivity activity) { 
     MAIN_ACTIVITY = activity; 
    } 

}

+0

サービスを開始するすべてのブロードキャスト受信者を使用しましたか? – Elad92

+6

あなたの活動からコードを投稿してサービスする場合、私たちはあなたを助けることができる可能性が非常に高いです。 – FoamyGuy

+0

私の投稿を編集して重要なコード部分を追加しましたが、 – sMau

答えて

1

サービスを停止/起動するには、2つの方法があります。

  1. サービス開始はContext.startService()です。そのようなサービスを停止するには、アクティビティにstopService()と呼ばれるか、またはサービス自体がstopSelf()に電話する必要があります。
  2. サービスはContext.bindService()で開始されました。バインドされたサービスを停止するにはALLbindService()と呼ばれるアクティビティはunbindService()と呼びます。

方法1でサービスを開始すると、サービスのonStartCommand()メソッドが呼び出され、それがないため2番目の方法を使用していると仮定しているためです。この場合、私の推測では、あなたのすべての活動がunbindService()と呼ばれるのではなく、サービスが停止した後にbindServiceと呼ばれる活動があると思います。

サービスの開始/停止方法の例については、Service APIを参照してください。

関連する問題