如何在Android中以编程方式设置闹钟?

16
以下是我的代码,有人能告诉我为什么它不起作用吗?我是从这个教程学习的。但它不起作用,任何帮助将不胜感激。
import java.util.Calendar;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.ListActivity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Toast;


public class Notify extends Activity {
    Button btn;

    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.nit);
        Calendar cal=Calendar.getInstance();
        cal.set(Calendar.MONTH,6);
        cal.set(Calendar.YEAR,2011);
        cal.set(Calendar.DAY_OF_MONTH,29);
        cal.set(Calendar.HOUR_OF_DAY,17);
        cal.set(Calendar.MINUTE,30);

        //String[] dude=new String[] {"nitin","avi","aman","rahul","pattrick","minkle","manmohan","nitin","nitin"};

        //setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,dude));
        //getListView().setTextFilterEnabled(true);

        //String[] dude1=new String[] {"nitin","avi","aman","rahul","pattrick","minkle","manmohan"};

        Intent intent = new Intent(this, Mote.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 1253, intent, PendingIntent.FLAG_UPDATE_CURRENT|  Intent.FILL_IN_DATA);

        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

        alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),pendingIntent );
        Toast.makeText(this, "Alarm worked.", Toast.LENGTH_LONG).show();
    }

}

我的接收器类是:

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class Mote extends BroadcastReceiver{

    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();
        int icon = R.drawable.icon;
        CharSequence tickerText = "Hello you have to take medicine I am Nitin Sharma";
        long when = System.currentTimeMillis();

        //Notification notification = new Notification(icon, tickerText,when );

        CharSequence contentTitle = "My notification";
        CharSequence contentText = "Hello World!";


        //notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
        final int NOTIF_ID = 1234;
        NotificationManager notofManager = (NotificationManager)context. getSystemService(Context.NOTIFICATION_SERVICE);
        // Notification note = new Notification(R.drawable.face,"NEW ACTIVITY", System.currentTimeMillis());
        Intent notificationIntent = new Intent(context, Alset.class);
        PendingIntent contentIntent = PendingIntent.getActivity(context,0, notificationIntent, 0);
        Notification notification = new Notification(icon, tickerText,when );
        //Notification notification1 = new Notification(R.drawable.icon, "Wake up alarm", System.currentTimeMillis());
        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
        notification.flags = Notification.FLAG_INSISTENT;
        notification.defaults |= Notification.DEFAULT_SOUND;
        //notification.setLatestEventInfo(context, "My Activity", "This will runs on button click", contentIntent);
        notofManager.notify(NOTIF_ID,notification);

        //PendingIntent contentIntent = PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class), 0);
        //notification.setLatestEventInfo(context, "Context Title", "Context text", contentIntent);
        //notification.flags = Notification.FLAG_INSISTENT;
    }



}

如何获取与特定应用程序相关的所有剩余细节?这意味着警报ID、文本、标题之类的内容。 - Karthick
为此,您必须创建一个单独的数据库表来存储它。 - Nitin
有没有其他方法可以在不使用数据库的情况下实现这个? - Karthick
1
您已在重新启动后设置了所有警报。 - Nitin
是的,但我遇到了问题,如何在哪里设置所有的警报? - Karthick
显示剩余2条评论
4个回答

25

我认为你想设置闹钟在6月26日而不是7月26日。如果是这样,请将 cal.set(Calendar.MONTH,6); 更改为 cal.set(Calendar.MONTH,5);,因为月份是基于零的。如果你打算在7月26日触发闹钟,则应在日期时间为2011年7月26日17:30时触发闹钟。


1
确切地说,这是Java逻辑运作的一个例子。 - miky
谢谢,你节省了我的时间 @frieza - Kanifnath Modak

5

1. 在清单文件中添加以下内容

 <receiver android:name=".MyAlarmReciever">
            <intent-filter>
                <action android:name="com.example.helloandroid.alarms" />
            </intent-filter>
        </receiver>        
  1. make a activity

         public class AlrmActivity extends BaseAcitivity {
    
            TimePicker myTimePicker;
            Button buttonstartSetDialog;
            TextView textAlarmPrompt;
    
            TimePickerDialog timePickerDialog;
    
            final static int RQS_1 = 1;
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_alrm);
    
                textAlarmPrompt = (TextView)findViewById(R.id.alarmprompt);
    
                buttonstartSetDialog = (Button)findViewById(R.id.startSetDialog);
                buttonstartSetDialog.setOnClickListener(new View.OnClickListener(){
    
                    @Override
                    public void onClick(View v) {
                        textAlarmPrompt.setText("");
                        openTimePickerDialog(false);
    
                    }});
    
    
            }
    
            private void openTimePickerDialog(boolean is24r){
                Calendar calendar = Calendar.getInstance();
    
                timePickerDialog = new TimePickerDialog(
                        AlrmActivity.this,
                        onTimeSetListener,
                        calendar.get(Calendar.HOUR_OF_DAY),
                        calendar.get(Calendar.MINUTE),
                        is24r);
                timePickerDialog.setTitle("Set Alarm Time");
    
                timePickerDialog.show();
    
            }
            TimePickerDialog.OnTimeSetListener onTimeSetListener
                    = new TimePickerDialog.OnTimeSetListener(){
    
                @Override
                public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
    
                    Calendar calNow = Calendar.getInstance();
                    Calendar calSet = (Calendar) calNow.clone();
    
                    calSet.set(Calendar.HOUR_OF_DAY, hourOfDay);
                    calSet.set(Calendar.MINUTE, minute);
                    calSet.set(Calendar.SECOND, 0);
                    calSet.set(Calendar.MILLISECOND, 0);
    
                    if(calSet.compareTo(calNow) <= 0){
                        //Today Set time passed, count to tomorrow
                        calSet.add(Calendar.DATE, 1);
                    }
    
                    setAlarm(calSet);
                }};
    
            private void setAlarm(Calendar targetCal){
    
                textAlarmPrompt.setText(
                        "\n\n***\n"
                                + "Alarm is set@ " + targetCal.getTime() + "\n"
                                + "***\n");
    
                Intent intent = new Intent(getBaseContext(), MyAlarmReciever.class);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RQS_1, intent, 0);
                AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
                alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent);
    
            }
    
        }
    

3. XML文件包括

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="hello" />
        <Button
            android:id="@+id/startSetDialog"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Set Target Time"/>
        <TextView
            android:id="@+id/alarmprompt"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

4. 创建闹钟管理器类

    public class MyAlarmReciever extends BroadcastReceiver {

        Vibrator v;
        Context ct;
        String  title;


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

            // TODO Auto-generated method stub
            ct=context;

            Log.e("onReceive", "ladskjflsakjdflskjdflskjdfslkjdflasdf");
            Toast.makeText(context, "OnReceive alarm test", Toast.LENGTH_SHORT).show();

            v=(Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE);
            v.vibrate(3000);

            int badgeCount = 1;
           // ShortcutBadger.applyCount(context, badgeCount);

            ShortcutBadger.removeCount(context);

            Bundle bundle = intent.getExtras();
            try{
                  title = intent.getExtras().get("title").toString();
                 // title = intent.getStringExtra("title");
                Toast.makeText(context, title, Toast.LENGTH_LONG).show();
            }catch(Exception e){
                e.printStackTrace();
            }


    //        if (!Utlis.checkNetworkConnection(context)) {
    //
    //            Notification(context, "Wifi Connection off");
    //
    //        } else {
                Notification(context, "Please  pray for this prayer ");

    //        }

        }


        public void Notification(Context context, String message) {
            // Set Notification Title
            String strtitle = "iPray  Prayer Reminder";
            // Open NotificationView Class on Notification Click
            Intent intent = new Intent(context, PrayerForOtherActivity.class);
            // Send data to NotificationView Class
            intent.putExtra("title", title);
            intent.putExtra("text", title);
            // Open NotificationView.java Activity
            PendingIntent pIntent = PendingIntent.getActivity(context, 0, intent,
                    PendingIntent.FLAG_UPDATE_CURRENT);

    //        NotificationCompat.Action action = new NotificationCompat.Action.Builder(R.drawable.app_icon, "Previous", pIntent).build();
            // Create Notification using NotificationCompat.Builder
            NotificationCompat.Builder builder = new NotificationCompat.Builder(
                    context)
                    // Set Icon
                    .setSmallIcon(R.drawable.app_icon)
                    // Set Ticker Message
                    .setTicker(message)
                    // Set Title
                    .setContentTitle(context.getString(R.string.app_name))
                    // Set Text
                    .setContentText(message)
                    // Add an Action Button below Notification
                    // Set PendingIntent into Notification
                    .setContentIntent(pIntent)
                    // Dismiss Notification
                    .setAutoCancel(true);

            // Create Notification Manager
            NotificationManager notificationmanager = (NotificationManager) context
                    .getSystemService(Context.NOTIFICATION_SERVICE);
            // Build Notification with Notification Manager
            notificationmanager.notify(38, builder.build());

        }
    }

2
你在清单文件中设置了接收器吗? 类似这样的东西。
<receiver  android:process=":remote" android:name=".Mote"></receiver>

1
是的,但 android:process=":remote" 不是必须的。 - Kevin Yuan
兄弟,android:process 标签仅用于将服务和接收器与您自己的应用程序分开运行。 - IgorGanapolsky

0
希望这能帮助到您。
@Override
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

                Calendar calNow = Calendar.getInstance();
                Calendar calSet = (Calendar) calNow.clone();

                calSet.set(Calendar.HOUR_OF_DAY, hourOfDay);
                calSet.set(Calendar.MINUTE, minute);
                calSet.set(Calendar.SECOND, 0);
                calSet.set(Calendar.MILLISECOND, 0);

                if(calSet.compareTo(calNow) <= 0){
                    //Today Set time passed, count to tomorrow
                    calSet.add(Calendar.DATE, 1);
                }

                setAlarm(calSet);
            }};

        private void setAlarm(Calendar targetCal){

            textAlarmPrompt.setText(
                    "\n\n***\n"
                    + "Alarm is set@ " + targetCal.getTime() + "\n"
                    + "***\n");

            Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RQS_1, intent, 0);
            AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    //      alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent);
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(),AlarmManager.INTERVAL_DAY, pendingIntent);
        }

如何获取与特定应用程序相关的所有剩余细节?这意味着警报ID、文本、标题之类的内容。 - Karthick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接