找不到在 taskAdapter 中使用警报管理器的方法

Cant find a way to work with Alarm manager in taskAdapter

我的问题很简单,我在我的 TaskAdapter 中弄得一团糟,现在我遇到了 onCreate 方法的问题,因为我的 TaskAdapter 中没有它(很明显)。 现在,如果您能给我一些关于如何实现我的 alarmManager 和 link 和 ALARM_SERVICE 的想法,那么代码就可以工作了。 这是我的 BaseAdapter:

'public class TaskAdapter extends BaseAdapter {
    //transfer context
    Context context;
    //transfer user to use for shared preferences
    String userName;
    //create a list of tasks.....
    List<taskItem> myTasks;
    Calendar calendar = Calendar.getInstance();
    AlarmManager alarmManager;
    PendingIntent pendingIntent;

    //constructor, for creating the adapter we need from the user context and userName
    public TaskAdapter(Context context, String userName) {
        this.context = context;
        this.userName = userName;
        //go to user shared preferences and fill the list
        getData();
        notifyDataSetChanged();

    }
    //how many item to display
    @Override
    public int getCount() {
        //return the myTasks size....
        return myTasks.size();
    }

    //return a specific item by index
    @Override
    public Object getItem(int i) {
        return myTasks.get(i);
    }

    //return index number
    @Override
    public long getItemId(int i) {
        return 0;
    }

    //create our view
    @Override
    public View getView(final int index, final View view, ViewGroup viewGroup) {
        //inflate the view inside view object -> viewInflated
        final View viewInflated = LayoutInflater.from(context).inflate(R.layout.task_item, null, false);
        //set our inflated view behavior

        //set pointer for our inflated view

        //set pointer for task name....
        final TextView txtTaskName = (TextView) viewInflated.findViewById(R.id.taskName);
        //set pointer for taskInfo
        final TextView txtTaskInfo = (TextView) viewInflated.findViewById(R.id.taskInfo);
        //set pointer for task status....
        final Switch swTask = (Switch) viewInflated.findViewById(taskDone);

        //set task name, by the index of my myTasks collection
        txtTaskName.setText(myTasks.get(index).taskName);
        //set task info, by index of myTasks collection
        txtTaskInfo.setText(myTasks.get(index).taskInfo);
        //set task status , switch is getting true/false
        swTask.setChecked(myTasks.get(index).taskStatus);

        //show date and time dialog
        final ImageView dtPicker = (ImageView) viewInflated.findViewById(R.id.imgTime);
        dtPicker.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final AlertDialog.Builder ad = new AlertDialog.Builder(context);
                final AlertDialog aDialog = ad.create();
                final LinearLayout adLayout = new LinearLayout(context);
                adLayout.setOrientation(LinearLayout.VERTICAL);
                TextView txtTime = new TextView(context);
                txtTime.setText("Choose time");
                adLayout.addView(txtTime);

                final TimePicker tp = new TimePicker(context);
                adLayout.addView(tp);
                final DatePicker dp = new DatePicker(context);
                tp.setVisibility(View.GONE);
                adLayout.addView(dp);


                final Button btnNext = new Button(context);
                btnNext.setText("Next>");
                adLayout.addView(btnNext);
                btnNext.setGravity(1);

                Button btnCancel = new Button(context);
                btnCancel.setText("Cancel");
                adLayout.addView(btnCancel);
                btnCancel.setGravity(1);


                btnCancel.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        aDialog.cancel();
                    }
                });
                btnNext.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        final int hour = tp.getHour();
                        final int min = tp.getMinute();

                        final String myHour = String.valueOf(hour);
                        final String myMin = String.valueOf(min);


                        calendar.set(Calendar.MONTH, dp.getMonth());
                        calendar.set(Calendar.YEAR, dp.getYear());
                        calendar.set(Calendar.DAY_OF_MONTH, dp.getDayOfMonth());
                        dp.setVisibility(View.GONE);
                        tp.setVisibility(View.VISIBLE);
                        btnNext.setText("Finish");
                        btnNext.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                calendar.set(Calendar.HOUR_OF_DAY, tp.getHour());
                                calendar.set(Calendar.MINUTE, tp.getMinute());
                                Intent my_intent = new Intent(context, AlarmReceiver.class);
                                pendingIntent = PendingIntent.getBroadcast(context, 0, my_intent, PendingIntent.FLAG_UPDATE_CURRENT);
                                alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
                                if(hour > 12){
                                    String myHour = String.valueOf(hour - 12);
                                }

                                if(min < 10)
                                {
                                    String myMin = "0"+String.valueOf(min);
                                }

                                Toast.makeText(context, "Set for- "+myHour+":"+myMin , Toast.LENGTH_LONG).show();
                                aDialog.cancel();
                            }
                        });
                    }
                });
                aDialog.setView(adLayout);
                aDialog.show();
            }
        });

        //create listener event, when switch is pressed
        swTask.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //we using utlShared to update task status
                //create instance of utlShared
                utlShared myShared = new utlShared(context);
                //calling method of task, and giving userName(shared preferences, taskName, taskStatus)
                myShared.task(userName, txtTaskName.getText().toString(), txtTaskInfo.getText().toString(), swTask.isChecked());
                //we sending a message to the user, and inform him/her about the change
                Toast.makeText(context, swTask.isChecked() ? "Task done" : "Task undone", Toast.LENGTH_SHORT).show();

            }
        });

        //return the view with the behavior.....
        return viewInflated;
    }

    private void getData() {
        //go to specific shared preferences by user name.....
        SharedPreferences taskPref = context.getSharedPreferences(userName, context.MODE_PRIVATE);
        //create instance of our myTasks list
        myTasks = new ArrayList<>();
        //get all tasks from shared preferances
        //the shared preferences is by key and value, therefor we will use Map collection
        //we know that the key is String, but we don't know what type of value we will get. <K,?>
        Map<String, ?> tasks = taskPref.getAll();
        // transfer the data from map collection to list collection , single item is like the defination of the tasks <String,?>
        //Entry -> record , enterSet -> set of records
        for (Map.Entry<String, ?> oneTask : tasks.entrySet()) {
            //insert task to list by Key and Value, we check if value is equal to 1, becuase 1=true 0=false
            String[] str = oneTask.getValue().toString().split(",");
            myTasks.add(new taskItem(str[0], str[1], str[2].equals("1")));
        }
    }

}'

我找不到开始的方法 "alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE)" 因为如果有办法的话,我真的不知道如何以其他方式启动它。

如有任何帮助,我们将不胜感激!

这是我的 AlarmReceiver:

public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("Didnt start alarm", "Too bad...");
        Intent service_intent = new Intent(context, RingtonePlayingService.class);
        context.startService(service_intent);
    }
}

这是铃声服务:

public class RingtonePlayingService extends Service {
    MediaPlayer someMedia;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        Log.i("Local Services", "Received start id "+ startId+": "+intent);
        someMedia = MediaPlayer.create(this, R.raw.skyrim);
        someMedia.start();

        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy()
    {
        Toast.makeText(this, "On destroy called!", Toast.LENGTH_SHORT).show();
    }


}

干杯。

您的 alarmManager 字段似乎没有被初始化。

将此行添加到您的 TaskAdapter 构造函数:

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

另外,你可以直接调用你的服务,不需要中间的BroadcastReceiver:

Intent my_intent = new Intent(context, RingtonePlayingService.class);
pendingIntent = PendingIntent.getService(context, 0, my_intent, PendingIntent.FLAG_UPDATE_CURRENT);

更新

应在清单中使用 service 标记声明服务。 参见:https://developer.android.com/guide/topics/manifest/service-element.html

<service android:name=".RingtonePlayingService" android:enabled="true"/>