Autore Topic: Mantenere un servizio perennemente attivo (anche con app chiusa).  (Letto 1376 volte)

Offline privi87

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
0
Ciao a tutti ragazzi,

vi ringrazio innanzitutto della pazienza!

Dunque il mio problema a dirsi e molto semplice, a farsi sicuramente meno! Sto sviluppando un'app che dialoga via bluetooth con un altro dispositivo.
Una volta installata,  dovrebbe avviare un servizio che si mantiene in vita anche quando la app è in background e, sopratutto, anche quando è chiusa!
Girovagando su internet ho inteso che lo strumento da usare sono i Service ma non avendo molta esperienza e non essendone sicuro chiedo a voi se è effettivamente fattibile programmare un comportamento del genere, in particolar modo mi riferisco alla mia seconda richiesta, ovvero al servizio attivo anche quando la app è completamente chiusa.

In parole povere vorrei avviare un servizio stile quello di whatsapp che, anche quando è chiuso, permette comunque la ricezione di messaggi.

Attendo lumi e vi ringrazio ancora!

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Mantenere un servizio perennemente attivo (anche con app chiusa).
« Risposta #1 il: 26 Aprile 2014, 16:17:54 CEST »
0
Secondo me è corretto usare un Service per una cosa del genere, visto che devi usare il Bluetooth, però...

In parole povere vorrei avviare un servizio stile quello di whatsapp che, anche quando è chiuso, permette comunque la ricezione di messaggi.

...tieni conto che Whatsapp quasi certamente è basato su notifiche PUSH, cioè è il server ad inviare i messaggi al dispostivo senza attendere che il dispositivo verifichi periodicamente.

La differenza sta nel consumo di batteria: se fai un servizio che mantiene sempre attivo il Bluetooth e lo controlla, finirà molto presto. Può anche andare più che bene, dipende da cosa ci devi fare.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline privi87

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
Re:Mantenere un servizio perennemente attivo (anche con app chiusa).
« Risposta #2 il: 26 Aprile 2014, 16:25:51 CEST »
0
Grazie della risposta bradipao!

In queste ore ho cominciato a scrivere un po' di codice ed effettivamente il Service è quello che serviva, ad ora riesco proprio a mantenere un servizio attivo anche quando l'applicazione è chiusa. Il problema che mi poni tu effettivamente può essere da considerare, mi chiedo: come funzionano quindi gli auricolari bluetooth? Il telefono fa da server per forza immagino, ingenuamente pensavo fosse tutto un po' trasparente nei confronti del programmatore e fosse android stesso a mettere in standby determinati servizi come il bluetooth pronti però a ricevere segnali e a "svegliarsi".

L'altra domanda che ti pongo, approfittando della tua gentilezza, è questa: Il service in questione che ho scritto deve accedere al bluetooth, ad ora ogni volta che tento di lanciare un messaggio via bluetooth mi crasha l'app e mi sono accertato che il problema è proprio il comando di invio del messaggio. Evidentemente è un problema di permessi; permessi che ho inserito nell'androidmanifest ma come permessi dell'app e non del service specifico. Il problema è forse dovuto a questo? Sapresti dirmi, in quel caso, qual è la sintassi corretta per specificare i permessi di un service all'interno del manifest?

Grazie mille!

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Mantenere un servizio perennemente attivo (anche con app chiusa).
« Risposta #3 il: 26 Aprile 2014, 16:38:43 CEST »
0
In queste ore ho cominciato a scrivere un po' di codice ed effettivamente il Service è quello che serviva, ad ora riesco proprio a mantenere un servizio attivo anche quando l'applicazione è chiusa. Il problema che mi poni tu effettivamente può essere da considerare, mi chiedo: come funzionano quindi gli auricolari bluetooth? Il telefono fa da server per forza immagino, ingenuamente pensavo fosse tutto un po' trasparente nei confronti del programmatore e fosse android stesso a mettere in standby determinati servizi come il bluetooth pronti però a ricevere segnali e a "svegliarsi".

Stai pur certo che quando android riesce a mettere in standby qualcosa, lo fa di sicuro. Per il Bluetooth la questione non è banale, infatti hanno creato lo standard Bluetooth LE (low energy) proprio per affrontare questo problema.

La cosa migliore è provare, così ti rendi conto col tuo profilo di utilizzo.

L'altra domanda che ti pongo, approfittando della tua gentilezza, è questa: Il service in questione che ho scritto deve accedere al bluetooth, ad ora ogni volta che tento di lanciare un messaggio via bluetooth mi crasha l'app e mi sono accertato che il problema è proprio il comando di invio del messaggio. Evidentemente è un problema di permessi; permessi che ho inserito nell'androidmanifest ma come permessi dell'app e non del service specifico. Il problema è forse dovuto a questo? Sapresti dirmi, in quel caso, qual è la sintassi corretta per specificare i permessi di un service all'interno del manifest?

Per i permessi, persino Eclipse ti permette di settarli da un menu a tendina, così da mettere automaticamente la sintassi corretta. Ma puoi anche trovarli facilmente su google.

Comunque, quando avviene un crash, c'è scritto qualcosa nel LogCat: apri il pannello del LogCat, cancella il contenuto, riproduci il crash e vai a cercare nelle righe "loggate" quelle corrispondenti all'errore. Se hai problemi di interpretazione, postali qua e tra tutti vediamo di capire cosa può essere.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline privi87

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
Re:Mantenere un servizio perennemente attivo (anche con app chiusa).
« Risposta #4 il: 26 Aprile 2014, 17:28:20 CEST »
0
Citazione
Stai pur certo che quando android riesce a mettere in standby qualcosa, lo fa di sicuro. Per il Bluetooth la questione non è banale, infatti hanno creato lo standard Bluetooth LE (low energy) proprio per affrontare questo problema.

La cosa migliore è provare, così ti rendi conto col tuo profilo di utilizzo.

Sì, ti ringrazio! Farò mano a mano dei test per vedere cosa succede!

Riguardo la questione del crash ho appurato che il problema è il tentativo di eseguire una telefonata con il seguente codice:

Codice: [Seleziona]
                                 Intent phoneIntent = new Intent(Intent.ACTION_CALL);
                                 phoneIntent.setData(Uri.parse("tel:**********"));
                               
try {
                                 startActivity(phoneIntent);
                                 Log.i("Finished making a call...", "");
                                 } catch (android.content.ActivityNotFoundException ex) {
                                 Toast.makeText(context,
                                 "Call faild, please try again later.",
                                 Toast.LENGTH_SHORT).show();
                                 }


l'app si blocca nel momento in cui esegue startActivity(phoneIntent). Il Manifest file che uso è il seguente:

Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.javacodegeeks.android.androidserviceexample"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />   
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
   
   
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.javacodegeeks.android.androidserviceexample.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service
            android:name="com.javacodegeeks.android.androidserviceexample.MyService"
            android:enabled="true"
            android:exported="true">
           
        </service>
       
    </application>
   
</manifest>

Purtroppo non posso vedere il LogCat perchè, utilizzando il bluetooth, non posso usare l'emulatore per testare la app ma solo il telefono vero e proprio! :-/

Grazie della pazienza!

Post unito: 26 Aprile 2014, 17:48:25 CEST
Perdonami se aggiungo ancora un commento ma ho in parte risolto il problema. Il problema è legato al fatto che tento di avviare la telefonata dal Service stesso; se dal Service avvio un'activity e da lì lancio la telefonata tutto va a buon fine. Pensi si possa evitare questo passaggio? O è necessario passare da un'activity?

Io credo che tutto dipenda dei permessi; è come se il service non abbia permessi per avviare telefonate ma, pur cercando molto su internet, non ho trovato nulla a riguardo su come impostarli. Alcuni dicono che i permessi vanno specificati per l'app in generale e non si può specificarli per un service particolare di quest'app.
« Ultima modifica: 26 Aprile 2014, 17:48:25 CEST da privi87, Reason: Merged DoublePost »