2013-12-21 10 views
2

내 안드로이드 앱에서 3 분마다 작업을 실행하려고하는데, CPU가 잠든다면 깨워서 작업을 실행해야합니다. 내 작업은 CheckTask이고 Runnable입니다. 나는 AlarmManager가 내가 필요한 것을 알고 있고, 그것을 작동 시키려고 노력했지만 OnReceive() 메소드는 결코 실행되지 않는다. 아래 관련 코드는 무엇이 잘못되었는지 알려줌으로써 문제를 해결하고 작동 시키도록하십시오.알람이 작동하지 않는 이유는 무엇입니까?

의 AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.charles.sitechecker" 
android:versionCode="1" 
android:versionName="1.0" > 
<uses-sdk 
android:minSdkVersion="18" 
android:targetSdkVersion="18"/> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.VIBRATE"/> 
<uses-permission android:name="android.permission.FLASHLIGHT"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/> 
<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme"> 
    <activity 
     android:name="com.charles.sitechecker.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=".LocalService" 
     android:enabled="true" 
     android:exported="false"> 
    <intent-filter> 
     <action android:name="com.charles.sitechecker.LocalService" /> 
    </intent-filter> 
    </service> 
    <receiver 
     android:name="com.charles.sitechecker.Alarm" 
     android:enabled="true"/> 
</application> 

Alarm.java

package com.charles.sitechecker; 

import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class Alarm extends BroadcastReceiver 
{ 

    private MainActivity mainActivity; 
    private AlarmManager aManager; 

    public Alarm() 
    { 

    } 

    Alarm(MainActivity mainActivity) 
    { 
     this.mainActivity = mainActivity; 
     aManager = (AlarmManager)mainActivity.getSystemService(Context.ALARM_SERVICE); 
    } 

    void scheduleAlarm() 
    { 
     Intent intent = new Intent(mainActivity, Alarm.class); 
     PendingIntent pIntent = PendingIntent.getBroadcast(mainActivity, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     aManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, System.currentTimeMillis(), 180000, pIntent); 
    } 

    public void onReceive(Context context, Intent intent) 
    { 
     Runnable task = new CheckTask(mainActivity); 
     task.run(); 
    } 

} 

LocalService.java

package com.charles.sitechecker; 

import android.app.Notification; 
import android.app.Service; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.IBinder; 

public class LocalService extends Service 
{ 

    public void onCreate() 
    { 
     Notification n = MainActivity.checkTask.mainActivity.notifier.sendOngoingNotification("SiteChecker", "Sleeping", -1); 
     startForeground(-1, n); 
     Alarm alarm = new Alarm(MainActivity.checkTask.mainActivity); 
     alarm.scheduleAlarm(); 
    } 

    public void onDestroy() 
    { 
     super.onDestroy(); 
    } 

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

    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     return START_STICKY; 
    } 

} 

답변

1

mainactivity에 알람을 설정하기위한 예제 클래스 :

public void setRepeatingAlarm() 
{ 

    Intent intent = new Intent(this, ReceiveAlarm.class); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, 
     intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 
     (*time_in_milis to repeat*), pendingIntent); 
} 

방송 수신기 :

public class ReceiveAlarm extends BroadcastReceiver { 


    @Override 
    public void onReceive(Context context, Intent intent) {   
     context.startService(new Intent(context, InService.class)); 
    } 
} 

의도 서비스 클래스 예 :

public class InService extends IntentService 
    { 
     public InService() { 
      super("InService"); 
      // TODO Auto-generated constructor stub 
     } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

//do your thing here 
} 

} 

매니페스트 내부 태그에 방송 수신기/서비스 클래스를 선언

<receiver android:name="ReceiveAlarm" /> 
<service android:name="InService"></service> 

이보십시오.

관련 문제