2017-09-09 5 views
0

アプリケーションでサービスクラスを作成して、バックグラウンドでタスクを実行しました。アプリケーションを終了すると、サービスはまだ実行されていますが、それは問題ありません。しかし問題は、アプリケーションを再実行すると、新しいサービスが実行され、アプリケーションを再起動するたびに新しいサービスが作成されることです。ここに私のコードはアプリケーションを再起動すると、新しいサービスが実行されます

public class myService extends Service { 

Socket socket; 


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


@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 


    connectSocket(); 

    return START_STICKY; 
} 

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

    socket.disconnect(); 
} 


private void connectSocket() { 
    try { 

     socket = IO.socket("http://192.168.1.52:2500"); 
     socket.on(Socket.EVENT_CONNECT, onConnected); 
     socket.on(Socket.EVENT_CONNECT_ERROR, onConnectionError); 
     socket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectionTimout); 
     socket.on(Socket.EVENT_DISCONNECT, onDisconnect); 
     socket.on("test_callback", eventCallback); 
     socket.connect(); 
    } catch (URISyntaxException e) { 
     Log.d(getClass().getSimpleName(), "Socket Connection Exception"); 
     e.printStackTrace(); 
    } 
} 

private Emitter.Listener onConnected = new Emitter.Listener() { 
    @Override 
    public void call(Object... args) { 
     Log.d("SocketIO","onConnected"); 
     socket.connect(); 
    } 
}; 

private Emitter.Listener onConnectionError = new Emitter.Listener() { 
    @Override 
    public void call(Object... args) { 
     Log.d("SocketIO","onConnectionError"); 
      socket.connect(); 
    } 
}; 


private Emitter.Listener onConnectionTimout = new Emitter.Listener() { 
    @Override 
    public void call(Object... args) { 
     Log.d("SocketIO","onConnectionTimout"); 
      socket.connect(); 
    } 
}; 


private Emitter.Listener onDisconnect = new Emitter.Listener() { 
    @Override 
    public void call(Object... args) { 
     Log.d("SocketIO","onDisconnect"); 
      socket.disconnect(); 
    } 
}; 


int notno = 0; 
private Emitter.Listener eventCallback = new Emitter.Listener() { 
    @Override 
    public void call(Object... args) { 
     JSONObject data = (JSONObject) args[0]; 
     String message; 
     try { 
      message = data.getString("message").toString(); 
      NotificationCompat.Builder mBuilder = 
        new NotificationCompat.Builder(myService.this) 
          .setSmallIcon(R.drawable.head) 
          .setContentTitle("Message") 
          .setContentText(message); 
      NotificationManager nfm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); 
      nfm.notify(notno ,mBuilder.build()); 
      notno++; 

     } catch (JSONException ignored) { 

     } 
    } 
}; 

}

とメインクラス内のonCreateメソッドでこのコードを実行します:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 
    startService(new Intent(getBaseContext(), myService.class)); 

} 
+0

アプリケーションからサービスを開始しようとしましたか? – algrid

+0

はい、あります。私は何をすべきか?最初のアクティビティクラスで –

答えて

1

これは仕様によるものです。 startServiceが呼び出されるたびに、onStartCommandが呼び出されます。これにより、異なるインテントで開始することができます。しかし、それは一度だけ作成されます(もちろん、リソースのために停止しない限り)。ソケットまたはスレッドのインスタンスを1つしか持たない場合は、onStartCommandが初めて呼び出されたときにそれらをインスタンス化することを確実にするそのジョブが呼び出されます。

また、あなたのコードはそのまま動作しません。サービスはデフォルトで独自のスレッドまたはプロセスを持っていません。つまり、あなたのソケット作業を行うために新しいThreadを起動する必要があります。そうしないと、NetworkOnMainThreadErrrorが発生します。

+0

まあ、私は初心者の開発者で、あなたは何を言っているのか考えています:D、私はいくつかの例と解決策を示しています。 –

関連する問題