0

Я пытаюсь создать будильник в запланированное время в будущем. Ниже приведен кодAndroid: AlarmManager не запускается

MainActivity.java

import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.View; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Toast; 

import java.util.GregorianCalendar; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    public void scheduleAlarm(View V) 
    { 
     // time at which alarm will be scheduled here alarm is scheduled at 1 day from current time, 
     // we fetch the current time in milliseconds and added 1 day time 
     // i.e. 24*60*60*1000= 86,400,000 milliseconds in a day 
     Long time = new GregorianCalendar().getTimeInMillis()+60*60*1000; 

     // create an Intent and set the class which will execute when Alarm triggers, here we have 
     // given AlarmReciever in the Intent, the onRecieve() method of this class will execute when 
     // alarm triggers and 
     //we will write the code to send SMS inside onRecieve() method pf Alarmreciever class 
     Intent intentAlarm = new Intent(this, AlarmReciever.class); 

     // create the object 
     AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

     //set the alarm for particular time 
     alarmManager.set(AlarmManager.RTC_WAKEUP,time, PendingIntent.getBroadcast(this,1, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT)); 
     Toast.makeText(this, "Alarm Scheduled for Tommrrow", Toast.LENGTH_LONG).show(); 

    } 
} 

AlarmReceiever.java

public class AlarmReciever extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     // TODO Auto-generated method stub 


     // here you can start an activity or service depending on your need 
     // for ex you can start an activity to vibrate phone or to ring the phone 

     String message="Hi I will be there later, See You soon";// message to send 

     // Show the toast like in above screen shot 
     Log.d("Alarm",message); 
     Toast.makeText(context, "Alarm Triggered and SMS Sent", Toast.LENGTH_LONG).show(); 
    } 

} 

content_main.xml

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:gravity="center_vertical" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <TextView 
     android:id="@+id/textView1" 
     android:gravity="center_horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Alarm Manager Example" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <Button 
     android:id="@+id/button1" 
     android:layout_marginTop="25dp" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Schedule The Alarm" 
     android:onClick="scheduleAlarm"/> 

</LinearLayout> 

Manifest

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

    <uses-permission android:name="com.android.alarm.permission.SET_ALARM"/> 

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

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

     <receiver android:name=".AlarmReciever"/> 
    </application> 

</manifest> 

Я пытаюсь генерировать сигнал через одну минуту, но, к сожалению, ничего не происходит. Что я тут сделал? Кроме того, как я могу убедиться, что мое расписание будет работать даже после перезагрузки/отключения телефона, а затем включения?

+1

Вы зарегистрировали Получателя в манифесте? Кроме того, '60 * 60 * 1000' миллисекунд - час. –

+0

@MikeM .: Извините, я опубликовал манифест сейчас. Я новичок в этом, поэтому я сделал, но не уверен, что это правильно. –

+0

Я редактировал свой комментарий. Возможно, вам потребуется обновить страницу. Если вы тестируете, вы можете просто установить время. –

ответ

1

Я думаю, вы не назвали свой метод scheduleAlarm() любым, где в коде выше. И для работы с расписанием даже после перезапуска/выключения телефона вам необходимо прослушать Событие BOOT_COMPLETED. Для слушать bootcompile код приведен ниже: -

Вы должны определить приемник в манифесте с именем действия android.intent.action.BOOT_COMPLETED.

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

Удостоверьтесь, что вы также включили законченное разрешение на загрузку.

BroadcastReceiver-

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class BootCompletedReceiver extends BroadcastReceiver { 

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

    } 
} 
+0

Зарегистрируйте свой приемник в манифесте следующим образом: '' –

+0

Спасибо. Просмотрев код, вы можете предложить, что включить в этот 'onRecieve'' ServiceStarter'? –

+0

@PeakGen сделать это: - 'if (намерение .getAction(). equalsIgnoreCase (Intent.ACTION_BOOT_COMPLETED)) { // ваш код .......... } ' –

1

Я попробовал ваш код и сделал некоторые изменения, и это работает для меня

public void scheduleAlarm() { 
     final AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     final PendingIntent wakeupIntent = PendingIntent.getBroadcast(this, 0, 
       new Intent(this, AlarmReciever.class), PendingIntent.FLAG_UPDATE_CURRENT); 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 
     calendar.add(Calendar.SECOND, 60); // first time 
     long frequency = 6* 1000; // in ms 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), frequency, wakeupIntent); 

    } 

Попробуйте это.

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