Autore Topic: BroadcastReceiver che usa un AlarmManager e avvia un Servizio periodicamente  (Letto 1173 volte)

Offline auron86

  • Nuovo arrivato
  • *
  • Post: 45
  • Respect: +1
    • Mostra profilo
Salve

e da un po che sto cercando di implementare un servizio che viene avviato al boot, e successivamente verra ripetuto periodicamente.


ecco la mia implementazione

Manifest

penso di aver implementato tutti i permessi e i vari receiver

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.alarmservice"
   android:versionCode="1"
   android:versionName="1.0" >
 <!-- Permessi utenti richiesti dall app e da wikitude oltre che dalle Mappe -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
   
    <uses-sdk
       android:minSdkVersion="14"
       android:targetSdkVersion="17" />

    <application
       android:allowBackup="true"
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name"
       android:theme="@style/AppTheme" >
        <activity
           android:name="com.example.alarmservice.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>
                <receiver
           android:name="com.example.alarmservice.AutoStart"
           android:enabled="true"
           android:exported="true" >
   
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
       
        <service
           android:name="com.example.alarmservice.TestService"
           android:enabled="true"
           android:exported="true" >
        </service>
    </application>
</manifest>

AutoStart.java

e la classe che in teoria al boot avvia il servizio "e funziona", e crea l' AlarmManager che periodicamente richiama in modo autonomo il servizio "e non funziona"

Codice (Java): [Seleziona]
public class AutoStart extends BroadcastReceiver {

/**
* Listens for Android's BOOT_COMPLETED broadcast and then executes
* the onReceive() method.
*/

       
        @Override
        public void onReceive(Context context, Intent arg1) {
                Log.d("Autostart", "BOOT_COMPLETED broadcast received. Executing starter service.");
                Toast.makeText(context, "Booting start", Toast.LENGTH_LONG).show();
               
                Calendar cal = Calendar.getInstance();
                AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(context, TestService.class);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
        am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 20000, pi);
            context.startService(new Intent(context, TestService.class));
        }
}



Main.java

ora come ora non serve a nulla


Codice (Java): [Seleziona]
public class MainActivity extends Activity{

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
        }
}



il problema è:

al boot, il servizio viene correttamente richiamato e fa ciò che deve fare, tuttavia  non viene/riesco a gestire AlarmManager e quindi la periodicità della chiamata del servizio non viene gestita.


qualcuno può darmi un aiuto ?????


P.s.(il servizio mostra semplicemente un toast)

Post unito: 13 Novembre 2013, 17:33:12 CET
risolto, domani posto il codice =)

Post unito: 14 Novembre 2013, 10:50:55 CET
Main

(non fa assolutamente nulla)

Codice (Java): [Seleziona]
import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity{

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
        }
}







AutoStart

(gestisce il BroadcastReceiver mandato dal sistema al boot e crea un  AlarmManager ogni 10 minuti)

Codice (Java): [Seleziona]
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import com.example.alarmservice.TestService;
import android.content.Context;
import android.content.Intent;
import android.os.SystemClock;
import android.util.Log;
import android.widget.Toast;

public class AutoStart extends BroadcastReceiver {
        private static final int PERIOD=600000;
/**
* Listens for Android's BOOT_COMPLETED broadcast and then executes
* the onReceive() method.
*/

       
        @Override
        public void onReceive(Context context, Intent arg1) {
                Log.i("push", "Start al Boot ok");
                Toast.makeText(context, "Start al Boot ok",Toast.LENGTH_LONG).show();
                scheduleAlarms(context);
        }
       
       
        static void scheduleAlarms(Context ctxt) {
            AlarmManager mgr=(AlarmManager)ctxt.getSystemService(Context.ALARM_SERVICE);
            Intent i=new Intent(ctxt, TestService.class);
            PendingIntent pi=PendingIntent.getService(ctxt, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
            mgr.setRepeating(AlarmManager.ELAPSED_REALTIME,SystemClock.elapsedRealtime() + PERIOD, PERIOD, pi);
                Toast.makeText(ctxt, "Start AlarmManager ok",Toast.LENGTH_LONG).show();
                Log.i("push", "Start AlarmManager ok");
               
          }
}

Servizio

(mostra una notifica ogni 10 minuti)


Codice (Java): [Seleziona]
import android.app.Notification;
import android.app.Notification.Builder;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.graphics.Color;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.Toast;

public class TestService extends Service {
        private NotificationManager nm;
        private static final int SIMPLE_NOTIFICATION_ID = 1;
        private NotificationManager mNotificationManager;

        @Override
        public IBinder onBind(Intent intent) {
                // TODO: Return the communication channel to the service.
                return null;
        }

        @Override
        public void onCreate() {
                // TODO Auto-generated method stub
                super.onCreate();
        }

        @Override
        public void onDestroy() {
                // TODO Auto-generated method stub
        }

        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
                // TODO Auto-generated method stub
                Log.i("push", "Start Service ok");
                Toast.makeText(this, "Start Service ok",Toast.LENGTH_LONG).show();
                sendSimpleNotification("testo della notifica","titolo della notifica");
                return START_STICKY;
        }

        public void sendSimpleNotification(String testo,String titolo) {
                NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
                mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
               
                // Titolo e testo della notifica
                notificationBuilder.setTicker("titolo veloce ");
                notificationBuilder.setWhen(System.currentTimeMillis());
                notificationBuilder.setContentTitle(titolo);
                notificationBuilder.setContentText(testo);
                notificationBuilder.setLights(Color.GREEN, 500, 500);
                notificationBuilder.setAutoCancel(true);
                notificationBuilder.setPriority(Notification.PRIORITY_DEFAULT);
                notificationBuilder.setSmallIcon(R.drawable.ic_launcher);
               
                // Creiamo il pending intent che verrà lanciato quando la notifica
                // viene premuta
                Intent notificationIntent = new Intent(this, MainActivity.class);
                PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
                notificationBuilder.setContentIntent(contentIntent);

                // Impostiamo il suono, le luci e la vibrazione di default
                notificationBuilder.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE | Notification.FLAG_AUTO_CANCEL);
                mNotificationManager.notify(SIMPLE_NOTIFICATION_ID, notificationBuilder.build());
                Toast.makeText(this, "Start Notifica ok",Toast.LENGTH_LONG).show();
               
        }
}

Manifest

(con i vari permessi ecc...)

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.alarmservice"
   android:versionCode="1"
   android:versionName="1.0" >
 <!-- Permessi utenti richiesti dall app e da wikitude oltre che dalle Mappe -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.VIBRATE" />
   
    <uses-sdk
       android:minSdkVersion="14"
       android:targetSdkVersion="17" />

    <application
       android:allowBackup="true"
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name"
       android:theme="@style/AppTheme" >
        <activity
           android:name="com.example.alarmservice.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>
                <receiver
           android:name="com.example.alarmservice.AutoStart"
           android:enabled="true"
           android:exported="true" >
   
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
       
        <service
           android:name="com.example.alarmservice.TestService"
           android:enabled="true"
           android:exported="true" >
        </service>
    </application>
</manifest>


« Ultima modifica: 14 Novembre 2013, 10:52:38 CET da auron86 »