Alarm with notification, notification wont pop up

2019-09-19 16:50发布

问题:

So I don't know why this code is not working. I wanted to make an "alarm" notification that would go off once a day. Just wanted to say I'm new to android. Changed up the code a bit couple of times but still wont work.

Alarm method executes notification does too but I get this : -248/? D/PowerManagerService﹕ releaseWakeLock flags=0x1 tag=AlarmManager W/ActivityManager﹕ Unable to start service Intent { flg=0x4 cmp=com.example.polakken.test/.lol (has extras) }: not found 06-13 00:00:00.825 231-267/? D/PowerManagerService﹕ acquireWakeLock flags=0x1 tag=AlarmManager 06-13 00:00:00.825 231-248/? D/PowerManagerService﹕ releaseWakeLock flags=0x1 tag=AlarmManager

My Code:

public class MainActivity extends ActionBarActivity {

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

        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = preferences.edit();
        int i = preferences.getInt("numberoflaunches", 1);

        if (i < 2) {
            alarmMethod();
            i++;
            editor.putInt("numberoflaunches", i);
            editor.commit();
        }

        if (savedInstanceState == null) {
            splashMethod();

        }


    }

//...

private void alarmMethod() {
        Intent intentbro = new Intent(this, lol.class);
        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

        PendingIntent pendingIntent = PendingIntent.getService(this, 0, intentbro, 0);

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.HOUR, 0);
        calendar.set(Calendar.AM_PM, Calendar.AM);
        calendar.add(Calendar.DAY_OF_MONTH, 1);

        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60 * 60 * 24, pendingIntent);


        Toast.makeText(MainActivity.this, "start alarm", Toast.LENGTH_LONG).show();

    }

//notification class

public class lol extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        NotificationCompat.Builder b = new NotificationCompat.Builder(this);

        Intent intent1 = new Intent(this.getApplicationContext(), MainActivity.class);
        PendingIntent pIntent = PendingIntent.getActivity(this, 1, intent1, 0);

        b.setContentText("lol");
        b.setContentTitle("Default notification");
        b.setSmallIcon(R.drawable.iconography_small_size);
        b.setContentIntent(pIntent);

        NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(1, b.build());

    }
}

回答1:

You are creating the PendingIntent with PendingIntent.getService(), but you are supplying an Intent with an Activity.

So for your code to work you would need to use PendingIntent.getActivity(). (Additionally you have to add the corresponding <activity> tag to your AndroidManifest.xml.)

However, this is probably not exactly what you want: The only thing the lol Activity does is adding a notification. You might want to use a BroadcastReceiver (or perhaps a WakefulBroadcastReceiver) instead. In this case you would need to use PendingIntent.getBroadcast() instead of getActivity().



回答2:

Follow these steps

1Create an Activity and add this code to setAlarm(can be any name)

Suppose you want to set Alarm for 24/02/15 ,14:00PM

@SuppressLint("UseSparseArrays")
public void setAlarms(Long id,String event_date,String event_time,Context context)
{



    Calendar cal=Calendar.getInstance();
    String[] parts=event_date.split("/");

    String Event_date=parts[0];
    String Event_month=parts[1];
    String Event_Year=parts[2];

    String[] parts1=event_time.split(":");

    String Event_HOD=parts1[0];
    String Event_MIN=parts1[1];

    cal.add(Calendar.YEAR, Integer.parseInt(Event_Year)-cal.get(Calendar.YEAR));
    cal.add(Calendar.MONTH, (Integer.parseInt(Event_month)-1)-cal.get(Calendar.MONTH));
    cal.add(Calendar.DAY_OF_MONTH, Integer.parseInt(Event_date)-cal.get(Calendar.DAY_OF_MONTH));
    cal.add(Calendar.HOUR_OF_DAY, Integer.parseInt(Event_HOD)-cal.get(Calendar.HOUR_OF_DAY));
    cal.add(Calendar.MINUTE, Integer.parseInt(Event_MIN)-cal.get(Calendar.MINUTE));
    cal.add(Calendar.SECOND, 0);


    AlarmManager am =(AlarmManager)context.getSystemService(Activity.ALARM_SERVICE);

     //Your BroadcastReceiver which will receive Alarm
    Intent intent = new Intent(context, AlarmReceiver.class);

    //you can use PutExtra() to send additional parameter with Intent

    //PendingIntent to add
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
        (int)(long)id, intent, PendingIntent.FLAG_UPDATE_CURRENT);


        am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
                pendingIntent);

 Toast.makeText(context, "alarm Set for Know", Toast.LENGTH_LONG).show();
 }

2)Inside BroadcastReceiver onReceive() method

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

    //Receive parameter and do what you want to do with parameter

    //Using RemoteViews you can Inflate a CustomLayout when user clicks      on Notification when you do not want any CustomLayout for Notification remove it
    RemoteViews contentView1 = new RemoteViews("com.example.new_reminder_book" , R.layout.custom_notification);
     contentView1.setTextViewText(R.id.cn_tv_title, Event_title);
        contentView1.setTextViewText(R.id.cn_tv_category, Event_category);
        contentView1.setImageViewResource(R.id.cn_tv_image, R.drawable.event);


    NotificationCompat.Builder mBuilder=new NotificationCompat.Builder(context)
    .setSmallIcon(R.drawable.appicon)
    .setContent(contentView1)
    .setAutoCancel(true)
    .setOngoing(true);


    //Target Activity that will start when you click on Notification
    Intent result=new Intent(context, EmptyActivity.class);


    // The stack builder object will contain an artificial back stack for the
    // started Activity.
    // This ensures that navigating backward from the Activity leads out of
    // your application to the Home screen.
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    // Adds the back stack for the Intent (but not the Intent itself)
    stackBuilder.addParentStack(EmptyActivity.class);
    // Adds the Intent that starts the Activity to the top of the stack
    stackBuilder.addNextIntent(result);

    PendingIntent resultPendingIntent =
            stackBuilder.getPendingIntent(
                0,
                PendingIntent.FLAG_UPDATE_CURRENT
            );

    mBuilder.setContentIntent(resultPendingIntent);

    Notification notification=mBuilder.build();
    notification.contentView=contentView1;



    NotificationManager mNotificationManager =
        (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    // mId allows you to update the notification later on.
    mNotificationManager.notify((int) System.currentTimeMillis(), notification);

    //A mp3 fine in res->raw that will play when notification fire
    MediaPlayer mp = MediaPlayer.create(context, R.raw.listen);
    mp.start();

    PowerManager pm = (PowerManager)     context.getSystemService(Context.POWER_SERVICE);

    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");

    wl.acquire();

    /*Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);

     //Set pattern for Vibration
    long[] pattern={2000,3000,4000};

    vibrator.vibrate(pattern,1);*/

    wl.release();


}

}

3)Declare Two permissions in Manifest.xml

<uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.VIBRATE"/>

4)Declare You AlarmReceiver in Manifest.xml

<receiver android:name=".extra.AlarmReceiver" android:label="@string/title_activity_alarm_receiver" android:exported="true"> </receiver>

Follow these documents http://developer.android.com/reference/android/content/BroadcastReceiver.html
http://developer.android.com/reference/android/app/AlarmManager.html
http://developer.android.com/guide/topics/ui/notifiers/notifications.html
http://developer.android.com/reference/android/os/PowerManager.WakeLock.html

Hope this will help you