2011-01-11 144 views
9

我一直在爲此奮鬥幾個小時。我也檢查了文檔和幾個主題。我在兩個主題中發現了這個代碼,兩個人都說代碼運行的很好,但不是在我的電腦上。第一個Toast出現,但第二個從不。哪裏不對?Android鬧鐘不能正常工作

public class HelloAndroid2 extends Activity { 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

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

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, 
    intent, PendingIntent.FLAG_ONE_SHOT); 

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10 * 1000), pendingIntent); 
    Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show(); 

} 

public final class AlarmReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show(); 

    } 
} 

}

+0

請顯示您的AndroidManifest.xml。您應該在清單中聲明您的廣播接收器,並且它會對 – ccheneson 2011-01-11 18:05:09

回答

33

其實你不需要指定的操作,因爲你的意圖使用類AlarmReceiver.class

在你AndroidManifest.xml,請確保您有<application>標籤內的接收器定義是這樣的:

<receiver android:name="AlarmReceiver">

編輯: 確定有2種方式來使用你的廣播接收器。

1)從你的代碼已經提供,AlarmReceiver.java即會包含:

public final class AlarmReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show(); 

    } 
} 

HelloAndroid2.java

public class HelloAndroid2 extends Activity { 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

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

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, 
    intent, PendingIntent.FLAG_ONE_SHOT); 

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10 * 1000), pendingIntent); 
    Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show(); 

} 

} 

這樣,你可以設置你的廣播接收器與AndroidManifest.xml和工作標籤<receiver ...>

2)第二種方式。有了這個方法,你可以只使用1檔HelloWorld2.java

在你的活動,創建您的廣播接收器和註冊。

public class HelloWorld2 extends Activity { 
    private SharedPreferences prefs; 
    private String mName; 


    BroadcastReceiver alarmReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      Toast.makeText(context, "Alarm worked", Toast.LENGTH_LONG).show();   
     } 
    }; 


    public static final String ACTION_NAME = "com.helloworld.MYACTION"; 
    private IntentFilter myFilter = new IntentFilter(ACTION_NAME); 


    @Override 
    protected void onPause() { 
     unregisterReceiver(alarmReceiver); 
     super.onPause(); 
    } 

    @Override 
    protected void onResume() { 
     registerReceiver(alarmReceiver, myFilter); 
     super.onResume(); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     registerReceiver(alarmReceiver, myFilter); 

     Intent intent = new Intent(ACTION_NAME);   

     PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, 
     intent, PendingIntent.FLAG_ONE_SHOT); 

     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10 * 1000), pendingIntent); 
     Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show(); 


    } 
+0

做出反應的操作感謝您的回答,但仍然沒有任何結果。這是.xml文件: <應用機器人:圖標= 「@繪製/圖標」 機器人:標籤= 「@串/ APP_NAME」> \t <接收機機器人:名稱= 「AlarmReceiver」> <活動機器人:名稱=」 HelloAndroid2" 。 機器人:標籤= 「@串/ APP_NAME」> <意圖濾波器> <操作機器人:名稱= 「android.intent.action.MAIN」/> <類別android:name =「android.intent.category.LAUNCHER」/> [/ code] – erdomester 2011-01-11 19:14:29

+0

對不起,我不知道如何使它看起來像這裏的代碼。 – erdomester 2011-01-11 19:22:37

10

我有同樣的問題,直到我發現我已將我的廣播接收器放在不同的包上,而不是普通的。

只是改變:

<receiver android:name=".AndroidAlarmService" android:enabled="true" > 

爲:

<receiver android:name="com.MyCompany.MyPackage.AndroidAlarmService" android:enabled="true" > 
0

如果回答上述方法不爲你工作那麼還有另一種方式來收到任何回調時AlarmManager火災過期的警報。您只需要檢查這一個:通過對PendingIntent實例發出錯誤Intent。例如你想收到你的接收機的一個呼叫onReceive,但你通過getActivitygetService實例化一個PendingIntent,但你實際上意味着是getReceiver

當創建的PendingIntent例如,有許多方法來創建它(getServicegetActivitygetReceivergetForegroundService

PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_*); 

,如果:如果你要Activity意圖的接收器,那麼你

你想BroadcastReceiver接收者的意圖:

PendingIntent.getReceiver(this, 0, intent, PendingIntent.FLAG_*); 

如果你想有一個前景Service意圖的接收器:

PendingIntent.getForegroundService(this, 0, intent, PendingIntent.FLAG_*); 

如果你想有一個Service意圖的接收器:

PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_*); 

此外,請確保您的意圖均指向正確的類。 (例如創建活動,服務等的意圖)。

Intent intent = new Intent(this, MyReceiver.class); // You wanted receiver 

// PendingIntent was created in such a way 
// you wanted this to be received by an activity. 
// you will not receive any call if you set it up like this. 
PendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_*); 

我還張貼類似的回答here:如果你通過不正當這樣你會不會收到任何呼叫。

HTH