Я пытаюсь создать службу, которая работает в фоновом режиме и запускается при загрузке устройства. Служба должна запустить AsyncTask, которая ожидает сообщений от сервера.
Класс BootReceiver:
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "In boot receiver app", Toast.LENGTH_LONG).show();
context.startService(new Intent(context, AppService.class));
}
}
Класс обслуживания:
public class AppService extends Service{
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate(){
super.onCreate();
try {
Toast.makeText(this, "In service app", Toast.LENGTH_LONG).show();
String message = new ListenForUpdates().execute(getApplicationContext()).get();
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId){
super.onStartCommand(intent, flags, startId);
return START_STICKY;
}
@Override
public void onDestroy(){
super.onDestroy();
}
}
Класс AsyncTask:
public class ListenForUpdates extends AsyncTask<Context, Void, String> {
private static final int portNumber = 12302;
private ServerSocket serverSocket;
private Socket socket;
private BufferedReader in;
private Context context;
@Override
protected String doInBackground(Context... c) {
String message = "";
context = c[0];
try {
message = connectAndListen();
in.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
return message;
}
private String connectAndListen() throws IOException {
serverSocket = new ServerSocket(portNumber);
String message;
while (true){
socket = serverSocket.accept();
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while ((message = in.readLine()) != null){
message = in.readLine();
break;
}
break;
}
return message;
}
}
Дополнения к androidManifest:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
...
<service
android:name=".connections.AppService"
android:theme="@style/AppTheme.CustomTheme">
</service>
<receiver android:name=".connections.BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
Код на стороне сервера:
try {
Socket s = new Socket("10.0.2.2", 12302);
BufferedWriter b = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
b.write("Received update! \n");
b.flush();
b.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
Когда я пытаюсь отправить сообщения на сервер, время ожидания истекает, как будто AsyncTask еще не запущен (?). Что я здесь не так делаю?