Android上的IntentService在后台运行

时间:2015-05-22 18:29:10

标签: android service background broadcastreceiver intentservice

我需要在Android上使用后台处理服务。 我提供了这项服务:

public class ServizioBackgrounds extends IntentService {
    public static int DEFAULT_PORT = 35500;
    private static int BUF_SIZE = 11;
    private static ....
    private static ....

    public ServizioBackgrounds() {
        super("ServizioBackground");
    }


    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("##### Servizio Attivato #####");
        super.onStart(intent, startId); // If I don't use, the onHandleIntent method ins't call
        return START_STICKY;
    }

    public void onDestroy(){
        System.out.println("### Servizio Terminato ###");

        Intent startService = new Intent("com.perseusgalaxia.interphone_citofono"); // Try.. But this method is never called
        startService.putExtra("AccendiServ", "AccendiServ");
        sendBroadcast(startService);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        System.out.println("##### SIAMO DENTRO #####");
        DatagramSocket socketAttesa = null;
            System.out.println("*** IL SERVIZIO E' ATTIVO ***");
        while(true){
           ...
        }
    }
}

然后我有这个BroadcasterReceiver:

public class BootCompletedReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("*** Broadcast Ricevuto ***");
        context.startService(new Intent(context,ServizioBackgrounds.class));
    }
}

这就是明白:

<service android:name=".ServizioBackground"
    />
<receiver android:name=".BootCompletedReceiver"
          android:enabled="true"
          android:exported="false" >
        <intent-filter>
                <action android:name="com.perseusgalaxia.interphone_citofono" />
                <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
</receiver>

这是我第一次启动服务的部分:

       Intent startService = new Intent("com.perseusgalaxia.interphone_citofono");
        startService.putExtra("AccendiServ", "AccendiServ");
        sendBroadcast(startService);

我以这种方式调用服务只是为了尝试。 问题是,如果我从应用程序活动开始,它启动并正常运行,但是当我关闭应用程序时服务也很接近。 令人惊奇的是,如果我重新启动智能手机,服务将在后台启动(没有显示任何活动等)并且工作正常。然后(重启后)如果我启动应用程序并关闭它们,服务就会关闭!

抱歉我的英文。 谢谢你的回答。

1 个答案:

答案 0 :(得分:0)

要在后台运行您的服务,您需要从服务中致电startForeground

以下是一个例子:

int serviceId = 101;

NotificationCompat.Builder b = new NotificationCompat.Builder(getApplicationContext());
b.setContentTitle("Working...")
        .setContentText("I'm working!")
        .setSmallIcon(R.mipmap.ic_launcher);

startForeground(serviceId, b.build());

请注意,如果您的服务在后台运行,则必须显示通知,以便通知用户您的工作。