2016-07-14 4 views
1

В моем приложении я пытаюсь позвонить BroadcastReceiver, используя AlarmManager, чтобы звонить службе каждую минуту. Но по какой-то причине его не называют. Я не могу понять причину этого. Я пишу этот код, следуя рабочему проекту, и я не мог найти ничего другого. Пожалуйста помоги.Почему мой AlarmManager не запускает BroadcastReceiver

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.shan.chathuranga.smsscheduler"> 

    <uses-permission android:name="android.permission.SEND_SMS" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
    <uses-permission android:name="android.permission.READ_CONTACTS" /> 
    <uses-permission android:name="android.permission.WRITE_CONTACTS" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".activities.SplashScreen"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name=".activities.MainActivity"/> 
     <activity android:name=".activities.ServiceChecker"/> 

     <service 
      android:name="services.MessageSendingService" 
      android:enabled="true" 
      android:exported="true"/> 

     <receiver android:name="broadcastReceiver.MessageServiceScheduler"> 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
     </receiver> 

     <receiver android:name="broadcastReceiver.MessageServiceTrigger"/> 

     <receiver 
      android:name="broadcastReceiver.SendBroadcastReceiver" 
      android:enabled="true" 
      android:exported="true"> 
      <intent-filter> 
       <action android:name="SMS_SENT" /> 
      </intent-filter> 
     </receiver> 

     <receiver 
      android:name="broadcastReceiver.DeliveryBroadcastReceiver" 
      android:enabled="true" 
      android:exported="true"> 
      <intent-filter> 
       <action android:name="SMS_DELIVERED" /> 
      </intent-filter> 
     </receiver> 

    </application> 

</manifest> 

SplashScreen.java

public class SplashScreen extends AppCompatActivity { 

    private Button mainUI; 
    private TextView dateTime; 
    private Button serviceChecker; 
    private static final long REPEAT_TIME = 1000; 

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

     this.initializeDatabase(); 
     this.triggerService(); 

     mainUI = (Button) findViewById(R.id.main_ui); 
     dateTime = (TextView) findViewById(R.id.date_time); 
     serviceChecker = (Button) findViewById(R.id.service); 

     DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
     Calendar cal = Calendar.getInstance(); 
     dateTime.setText(dateFormat.format(cal.getTime())); 

     mainUI.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(SplashScreen.this, MainActivity.class); 
       startActivity(i); 
      } 
     }); 

     serviceChecker.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(SplashScreen.this, ServiceChecker.class); 
       startActivity(i); 
      } 
     }); 

    } 

    public void initializeDatabase() { 
     DBAdapter dbAdapter = new DBAdapter(this); 
     dbAdapter.open(); 
     dbAdapter.close(); 
    } 

    public void triggerService() { 

     Intent intent = new Intent(this, MessageServiceTrigger.class); 
     PendingIntent pending = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     Calendar cal = Calendar.getInstance(); 
     alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), REPEAT_TIME, pending); 

    } 
} 

MessageServiceTrigger.java

public class MessageServiceTrigger extends BroadcastReceiver { 

    private static final String TAG = MessageServiceTrigger.class.getSimpleName(); 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(TAG,TAG+" onReceive get called"); 
    } 
} 
+0

документация для setInexactRepeating(): С API 19 все повторяющиеся сигналы тревоги неточны. Поскольку этот метод доступен с API 3, ваше приложение может безопасно называть его и быть уверенным, что оно будет получать аналогичное поведение как для текущих, так и для старых версий Android. проверить эту ссылку: https://developer.android.com/reference/android/app/AlarmManager.html#setInexactRepeating%28int,%20long,%20long,%20android.app.PendingIntent%29 – prGD

ответ

1

Прежде всего, вам необходимо изменить свой REPEAT_TIME = 1000; Это соответствует 1 секунде, не одна минута.

private static final long REPEAT_TIME = 60000; 

Дальше. Попробуйте изменить способ triggerService(), как показано ниже.

public void triggerService() { 
    Intent intent = new Intent(this, MessageServiceTrigger.class); 
    PendingIntent pending = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
    AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), REPEAT_TIME, pending); 
} 
+0

Все еще не работает. :( –

+0

Что происходит? Приложение сработает, или работает нормально, но только вызовы не вызываются? Если вы получаете ошибки, включите их в свой вопрос. – Marat

+0

В этом я не ошибаюсь. внутри MessageServiceTrigger onReceive не получает отображение. –

0

Попробуйте

<receiver android:name="broadcastReceiver.MessageServiceTrigger" 
       android:process=":remote" /> 
+0

Спасибо. Но не работает –

0

Есть ли правила, которые говорят, что вы не должны использовать заглавные буквы для имен пакетов. Потому что я весь день тратил впустую. Поскольку у меня есть еще четыре радиоприемника в моем проекте, я создал пакет с именем broadcastReceiver. вот где я разместил свой класс MessageServiceTrigger. Я меняю это на broadcast_receiver только потому, что у меня нет другого изменения в моем коде, и у меня есть рабочий проект со мной, у которого есть идентичный код, который работает нормально. Теперь он работает. Спасибо за все ваши ответы.

+0

ли ваши тревоги теперь работать? Вы только изменили название пакета? – Marat

+0

Да сейчас работает. –

+0

Что вы изменили, чтобы сделать его работу ? – Marat

Смежные вопросы