2014-05-21 3 views
0

나는 alarmmanager 및 broadcastreceiver에 대한 정보를 검색하는 데 2 ​​일 (약 12 시간)이 걸렸으며 실제로 작동하도록 관리하지만 실제로 이상한 문제를 실험하고 있습니다.AlarmManager가 실행되지 않음

저는 서비스를 시작하려고합니다. 그러면 서비스가 시작됩니다. 때로는 작동하지만 작동을 멈추는 경우도 있습니다. 정말 이상하지만 해결책은 방송 수신자를 알람 의도로 호출 한 다음 클래스를 서비스의 수신자로 변경하는 것입니다. 내가 말했듯이 그것은 정말 이상하지만, 그렇게 한 후에는 (3 번째 또는 4 번째 컴파일이 될 때까지는 다시 작동하지 않습니다.) 잠시 동안 작동합니다.

왜 가끔씩 작동하는지 이해할 수는 없지만 일부는 그렇지 않습니다.

가 여기 내 브로드 캐스트 리시버 클래스의 :

공용 클래스 ServeiConnexio가 {

// Definim les variables que utilitzarem 
private ArrayList<String> params_conn = new ArrayList<String>(); 
private String[] conn_params = null; 
private ServidorsSQL factory = null; 
private Funcions funcions = new Funcions(); 

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

public void onStart(Intent intent, int startid) { 
    //Toast.makeText(this, "Iniciant servei", Toast.LENGTH_LONG).show(); 
    Log.d("SERVEI - He entrat a onStart", "onStart"); 

    factory = new ServidorsSQL(this,"Servidors", null,9); 
    Log.d("Carrego info de tots els servidors","Carrego dades"); 
    funcions.llegeix(params_conn, factory); 

    // Calling alarm 
    Log.d("Executo alarma",""); 
    BootCompletat.SetAlarm(this); 

    // Search for data to create the intent 
    // The loop works perfectly and the intentservice works like charm 
    // So it doesn't have anything to do with the alarm not working 
    for(int m=0;m<params_conn.size();m++){ 
     Log.d("Entro al servei: " + Integer.toString(m),"Executo ConnectaSSH"); 
     // Partim els resultats en un array per poder-los passar a l'intent 

     conn_params = params_conn.get(m).split("\n"); 

     Intent i = new Intent(); 
     i.putExtra("Resultats", conn_params); 
     i.setClass(ServeiConnexio.this,IntentServeiConnexio.class); 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     Log.d("Crido activity ConnectaSSH: " + Integer.toString(m),"IntentServeiConnexio"); 
     startService(i); 
     Log.d("Finalitzo activity IntentServeiConnexio: ",Integer.toString(m)); 
    } 
} 

@Override 
public void onDestroy() { 
     Toast.makeText(getApplicationContext(), "Servei destruït",Toast.LENGTH_SHORT).show(); 
     super.onDestroy(); 
} 
서비스를 확장 :

공용 클래스 BootCompletat가 브로드 캐스트 리시버를 확장 {

@Override 
public void onReceive(Context context, Intent intent) { 

    if ((intent.getAction() != null) && (intent.getAction().equals("android.intent.action.BOOT_COMPLETED"))){ 
     Log.d("BOOT COMPLETAT!! Inicio el servei","Iniciat"); 
     context.startService(new Intent(context, ServeiConnexio.class));  
    }else if((intent.getAction() != null) && (intent.getAction().equals("com.example.primerprograma.ALARMA_DISPARADA"))){ 
     Log.d("ALARMA!! Inicio el servei","Iniciat"); 
     context.startService(new Intent(context, ServeiConnexio.class)); 
    } 
    Log.d("Detecto un esdeveniment: ",intent.getAction().toString()); 
    //Toast.makeText(context, "Detecto un esdeveniment", Toast.LENGTH_SHORT).show(); 
} 

public static void SetAlarm(Context context){ 
    Log.d("Crido l'alarma","Cridant"); 
    int act = 1; 
    //Toast.makeText(context, "Crido l'alarma", Toast.LENGTH_LONG).show(); 
    AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    // When it stops working, I change on the line below ServeiConnexio.class for BootCompletat.class 
    // Then it starts working (it updates every second) and I change it back to ServeiConnexio.class. After that, it works for a while (???) 
    Intent i = new Intent(context, ServeiConnexio.class); 
    i.setAction("com.example.primerprograma.ALARMA_DISPARADA"); 
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); 
    am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * act, pi); // Millisec * Second * Minute 
} 

}

여기 내 ServiceClass입니다

}

어떤 도움, 나는 필사적지고있어 이해할 수있을 것이다

답변

0

이 코드는 나를 위해 노력하고 있습니다 :

// Start service using AlarmManager 
    try { 

     Calendar cal = Calendar.getInstance(); 
     cal.add(Calendar.SECOND, 10); 

     Intent intent = new Intent(this, YourService.class); 

     PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0); 

     AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 



     alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 20000 , pintent); //20 second 
     startService(new Intent(getBaseContext(), YourService.class)); 
     Log.d(tag, "Timer Started.."); 


} catch (Exception e) { 
    Log.d(tag, "timer error: "+e); 
    e.printStackTrace(); 
} 
+0

완벽한, 나는 어디 코드의 차이는 확실하지 않다과 내 것이지만 너의 일은 매력처럼 작동한다. 대단히 감사합니다. – user3424020

관련 문제