2017-11-18 185 views
1

這是我的拳頭應用程序,我試圖使Alarm managerBroadcastReceiver一起使用。廣播接收器報警管理器

我用我希望Alarm manager觸發onReceive()的時間調用函數「SetFutureStartTime()」。但是當時機到來時,什麼也沒有發生。

這是個代碼:

public void SetFutureStartTime(int startHour, int startMin) 
{ 
    Context context = this; 

    m_alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(context, AlarmReceiver_SendOn.class); 
    intent.setAction("Broadcast"); 
    m_alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 

    // Set the alarm to start at 21:32 PM 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.set(Calendar.HOUR_OF_DAY, startHour); 
    calendar.set(Calendar.MINUTE, startMin); 

    m_alarmMgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), m_alarmIntent); 
} 

public class AlarmReceiver_SendOn extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     SendTcpMessage(TURN_ON_COMMAND); //I put here break point but nothing happens 
    } 
} 

這是manifast末:

..... 
</activity> 
    <receiver android:name=".MainActivity$AlarmReceiver_SendOn"> 
     <intent-filter> 
      <action android:name="Broadcast"> 
      </action> 
     </intent-filter> 
    </receiver> 
</application> 

我缺少什麼?

+0

是'AlarmReceiver_SendOn'一個內部類的'MainActivity'的,就像清單中顯示的那樣? –

+0

嗨,是的......它在'MainActivity'裏面。 – user1673206

+0

如果你想讓Receiver類成爲一個嵌套類,它必須是'public static'。 –

回答

1

此代碼的工作對我來說: 這個MainActivity

public class MainActivity extends AppCompatActivity { 

    private AlarmManager m_alarmMgr; 

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

    public void SetFutureStartTime(int startHour, int startMin) 
    { 
     Context context = this; 

     m_alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
     Intent intent = new Intent(context, com.asb.test.testapplication.AlarmReceiver_SendOn.class); 
     PendingIntent m_alarmIntent = PendingIntent.getBroadcast(context, (int) System.currentTimeMillis(), intent, 0); 

     // Set the alarm to start at 21:32 PM 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 
     calendar.set(Calendar.HOUR_OF_DAY, startHour); 
     calendar.set(Calendar.MINUTE, startMin); 

     m_alarmMgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), m_alarmIntent); 
    } 

} 

這是AlarmReceiver_SendOn

public class AlarmReceiver_SendOn extends BroadcastReceiver 
    { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      Log.i("TAG", "Started >>>>>>>"); 
      //and doing something 

     } 
    } 

這AndroidManifest

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.asb.test.testapplication"> 
    <uses-permission android:name="com.android.alarm.permission.SET_ALARM"/> 
    <uses-permission android:name="android.permission.WAKE_LOCK"/> 
    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:roundIcon="@mipmap/ic_launcher_round" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

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

     <receiver android:name=".AlarmReceiver_SendOn"> 
     </receiver> 

    </application> 
</manifest>