2017-03-27 10 views
0

私の質問は簡単ですが、私はTaskAdapterでちょっと混乱しましたが、今はTaskAdapterに持っていないのでonCreateメソッドの問題に直面しています明らかに)。 アラームマネージャを実装し、ALARM_SERVICEをリンクしてコードが動作するようにする方法について、私にいくつかのアイデアを伝えられたら、 HERESに私のBaseAdapter:taskAdapterでアラームマネージャを使用する方法を見つける

'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)」 を開始する方法を見つけるカント私は本当にいけない方法があれば、他の方法でそれを起動する方法を知っているので。

ご協力いただければ幸いです。 RingtoneService

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(); 
    } 


} 

乾杯

は、ここに私のAlarmReceiverです。

答えて

0

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); 

UPDATE

サービスは、マニフェストのserviceタグ。 を参照してください:https://developer.android.com/guide/topics/manifest/service-element.html

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

だけで着信音を開始didntの、私は推測そこイムhalph方法がようalarmManager.set、それがクラッシュをdidntの前に、私はラインに追加して、ありがとうございました...私は自分のコードを更新し、もしあなたがクールで私に言ってくれたら、なぜそれがやってくれなかったのか、私はもっと幸せになるでしょう! – z3r0

+0

最初に、自分の答えをAlarmManagerから直接呼び出す方法を追加しました。次に、 'someMedia.start'に到達するまでログの各ステップに沿ってログを追加し、ログがどこで停止するかを確認する必要があります。正確にフローが壊れている箇所をピンポイントで指定できます。 'ただ着メロを始めるdidntは'あなたを助けるコミュニティのために非常に有用ではない – marmor

+0

よいアイデア、それにあなたに私に感謝。 – z3r0

関連する問題