i'm creating notification alarm app and the notification not created
i create this app but it is not send a notification at the time choosen please can any one help me to solve this problem xml file:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center_horizontal" tools:context=".MainActivity"> <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter your task" android:layout_marginBottom="20dp"/> <TimePicker android:id="@+id/timePicker" android:layout_width="300dp" android:layout_height="342dp"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:layout_marginTop="30dp"> <Button android:id="@+id/setBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="set" android:layout_marginRight="20dp"/> <Button android:id="@+id/cancelBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="cancel"/> </LinearLayout>
and this is the MainActivity class for app: package com.examble.alarmlast; import androidx.appcompat.app.AppCompatActivity;
import android.app.AlarmManager; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TimePicker; import android.widget.Toast; import java.util.Calendar; public class MainActivity extends AppCompatActivity { private AlarmManager alarmMgr; private PendingIntent alarmIntent; Button setbtn; TimePicker timePicker; EditText edt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setbtn = findViewById(R.id.setBtn); edt=findViewById(R.id.editText); timePicker=findViewById(R.id.timePicker); final int hour = timePicker.getCurrentHour(); final int minute = timePicker.getCurrentMinute(); setbtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE); AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE); Intent intent = new Intent(MainActivity.this, AlarmReceiver.class); intent.putExtra("todo", edt.getText().toString()); alarmIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0); // Set the alarm to start at 8:30 a.m. Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY,hour ); calendar.set(Calendar.MINUTE, minute); // setRepeating() lets you specify a precise custom interval--in this case, // 20 minutes. alarm.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60 * 20, alarmIntent); Toast.makeText(MainActivity.this, "Done!", Toast.LENGTH_SHORT).show(); } }); } }
and this is the AlarmReceiver class for app:
package com.examble.alarmlast; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Build; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; import static androidx.core.content.ContextCompat.getSystemService; public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String message = intent.getStringExtra("todo"); // When notification is tapped, call MainActivity. Intent mainIntent = new Intent(context, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); PendingIntent contentIntent = PendingIntent.getActivity(context, 0, mainIntent, 0); if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O) { NotificationChannel notificationChannel = new NotificationChannel("n","n", NotificationManager.IMPORTANCE_DEFAULT); NotificationManager myNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); myNotificationManager.createNotificationChannel(notificationChannel); } // Prepare notification. NotificationCompat.Builder builder = new NotificationCompat.Builder(context,"n") .setContentText(message) .setContentTitle("It's Time!") .setSmallIcon(android.R.drawable.ic_dialog_info) .setAutoCancel(true) .setContentText(message) .setWhen(System.currentTimeMillis()) .setContentIntent(contentIntent) .setPriority(Notification.PRIORITY_MAX) .setDefaults(Notification.DEFAULT_ALL); // Notify NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context); notificationManagerCompat.notify(999,builder.build()); } }
AndroidManifast:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.abeer.alarmlast"> <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" /> </application> </manifest>
Receiver doesnt know when to invoke itself.
<receiver android:name=".AlarmReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
You need to specify when to invoke it.