简体   繁体   English

带有通知的警报,通知不会弹出

[英]Alarm with notification, notification wont pop up

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. 只是想说我是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/? 警报方法也执行通知,但是我得到了:-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:releaseWakeLock标志= 0x1标签= AlarmManager W / ActivityManager:无法启动服务意图{flg = 0x4 cmp = com.example.polakken.test / .lol(有其他功能)}:找不到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:AcquisitionWakeLock标志= 0x1标签= AlarmManager 06-13 00:00:00.825 231-248 /? D/PowerManagerService﹕ releaseWakeLock flags=0x1 tag=AlarmManager D / PowerManagerService:releaseWakeLock标志= 0x1标签= 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());

    }
}

You are creating the PendingIntent with PendingIntent.getService() , but you are supplying an Intent with an Activity . 您正在使用PendingIntent.getService()创建PendingIntent ,但要为Activity提供一个Intent

So for your code to work you would need to use PendingIntent.getActivity() . 因此,为了使代码正常工作,您需要使用PendingIntent.getActivity() (Additionally you have to add the corresponding <activity> tag to your AndroidManifest.xml .) (此外,您必须将相应的<activity>标签添加到您的AndroidManifest.xml 。)

However, this is probably not exactly what you want: The only thing the lol Activity does is adding a notification. 但是,这可能不完全是您想要的: lol活动唯一要做的就是添加一个通知。 You might want to use a BroadcastReceiver (or perhaps a WakefulBroadcastReceiver ) instead. 您可能想使用BroadcastReceiver (或者也许是WakefulBroadcastReceiver )。 In this case you would need to use PendingIntent.getBroadcast() instead of getActivity() . 在这种情况下,您将需要使用PendingIntent.getBroadcast()而不是getActivity()

Follow these steps 跟着这些步骤

1Create an Activity and add this code to setAlarm(can be any name) 1创建一个活动并将此代码添加到setAlarm(可以是任何名称)

Suppose you want to set Alarm for 24/02/15 ,14:00PM 假设您要将闹钟设置为15年2月24日,14:00

@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 2)在BroadcastReceiver内部的onReceive()方法

@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 3)在Manifest.xml中声明两个权限

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

4)Declare You AlarmReceiver in Manifest.xml 4)在Manifest.xml中声明您的AlarmReceiver

<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/content/BroadcastReceiver.html
http://developer.android.com/reference/android/app/AlarmManager.html http://developer.android.com/reference/android/app/AlarmManager.html
http://developer.android.com/guide/topics/ui/notifiers/notifications.html http://developer.android.com/guide/topics/ui/notifiers/notifications.html
http://developer.android.com/reference/android/os/PowerManager.WakeLock.html http://developer.android.com/reference/android/os/PowerManager.WakeLock.html

Hope this will help you 希望这个能对您有所帮助

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM