2017-01-07 4 views
1

どのように通知しますか? ニュースの日付を確認し、ニュースがあるときに通知する方法を教えてください。 サービスはSharedPrefをFragmentから取得して確認してから、通知するかどうかを指定できますか?JSONの通知サービス

TabFragment1.classコード:

@Override 
protected void onPostExecute(StringBuilder stringBuilder) { 

    try { 
     JSONObject jsonObject = new JSONObject(stringBuilder.toString()); 
     JSONArray array = jsonObject.getJSONArray("articles"); 
     for (int i = 0; i < array.length(); i++) { 
      JSONObject object = array.getJSONObject(i); 
      String title = object.getString("title"); 
      String desc = object.getString("description"); 
      String imageUrl = object.getString("urlToImage"); 
      String articleUrl = object.getString("url"); 
      String newsdata = object.getString("publishedAt"); 

      sPref = getActivity().getSharedPreferences("MyPref", MODE_PRIVATE); 
      SharedPreferences.Editor ed = sPref.edit(); 
      ed.putString(SAVED_TEXT, newsdata); 
      ed.commit(); 
      Toast.makeText(getActivity(), "Text saved", Toast.LENGTH_SHORT).show(); 
      News news = new News(title, desc, imageUrl, articleUrl); 
      myAdapter.addNews(news); 

      myAdapter.notifyDataSetChanged(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

通知サービスコード:

public class Notification extends Service { 
    String datanews; 
    String titlenotif; 
    String destnotif; 
    MyAsynk asynk; 
    final String SAVED_TEXT = "saved_text"; 
    String checker; 
    SharedPreferences sPref; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Timer timer = new Timer(); 
     timer.schedule(new UpdateTimeTask(), 0, 1800000); //тикаем каждые 30 мinute без задержки 1800000 
    } 

    class UpdateTimeTask extends TimerTask { 
     public void run() { 
      sPref = getSharedPreferences("MyPref",MODE_PRIVATE); 
      String savedText = sPref.getString(SAVED_TEXT, ""); 
      checker = sPref.getString(savedText, "0"); 

      if(datanews != checker){ 
       asynk = new MyAsynk(); 
       asynk.execute(); 
       createNotification(getApplicationContext());//пушим уведомление 
      } else { 
       asynk = new MyAsynk(); 
       asynk.execute(); 
      } 
     } 
    } 

    class MyAsynk extends AsyncTask<Void,Void,StringBuilder> { 
     @Override 
     protected StringBuilder doInBackground(Void... voids) { 
      StringBuilder stringBuilder = new StringBuilder(); 
      String key = "0aa2713d5a1a4aad9a914c9294f6a22b"; 
      try { 
       URL url = new URL("https://newsapi.org/v1/articles?source=the-next-web&sortBy=latest&apiKey=" + key); 
       URLConnection uc = url.openConnection(); 
       uc.connect(); 
       BufferedInputStream in = new BufferedInputStream(uc.getInputStream()); 
       int ch; 
       while ((ch = in.read()) != -1) { 
        stringBuilder.append((char) ch); 
       } 
      } catch (Exception e) {e.printStackTrace();} 

      return stringBuilder; 
     } 

     @Override 
     protected void onPostExecute(StringBuilder stringBuilder) { 
      try { 
       JSONObject jsonObject = new JSONObject(stringBuilder.toString()); 
       JSONArray array = jsonObject.getJSONArray("articles"); 
       for (int i = 0; i < array.length(); i++) { 
        JSONObject object = array.getJSONObject(i); 
        String title = object.getString("title"); 
        String desc = object.getString("description"); 
        String newsdata = object.getString("publishedAt"); 
        datanews = newsdata; 
        titlenotif = title; 
        destnotif = desc; 
       } 
      } 
      catch (Exception e){e.printStackTrace();} 
     } 
    } 

    private void createNotification(Context context) { 
     NotificationManager manager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE); 
     NotificationCompat.Builder ncBuilder = new NotificationCompat.Builder(context); 
     Intent intent = new Intent(this, MainActivity.class); 
     PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0); 
     ncBuilder.setVibrate(new long[]{500}); 
     ncBuilder.setLights(Color.WHITE, 3000, 3000); 
     ncBuilder.setSound(Settings.System.DEFAULT_NOTIFICATION_URI); 
     ncBuilder.setContentIntent(pIntent); 
     ncBuilder.setContentTitle(titlenotif + ""); 
     ncBuilder.setContentText(destnotif + ""); 
     ncBuilder.setTicker("You have news!"); 
     ncBuilder.setSmallIcon(R.drawable.news_icon); 
     ncBuilder.setAutoCancel(true); 
     manager.notify((int)System.currentTimeMillis(),ncBuilder.build()); 
    } 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 
} 

答えて

0

はいServiceSharedPreferenceを読み取ることができ、通知を行うことができます。

私が正しく理解していれば、MyAsynkクラスのonPostExecute機能で通知を作成する必要があります。

このように、AsyncTaskに公開属性を追加してみてください。

class MyAsynk extends AsyncTask<Void,Void,StringBuilder> { 

    public boolean showNotification; 

    // .. Other functions 
} 

は、今すぐあなたのMyAsynkクラスのonPostExecuteで今すぐあなたのUpdateTimerTask

if(datanews != checker){ 
    asynk = new MyAsynk(); 
    asynk.showNotification = true; 
    asynk.execute(); 
} else { 
    asynk = new MyAsynk(); 
    asynk.showNotification = false; 
    asynk.execute(); 
} 

に、あなたはブール値をチェックし、それに応じて通知を作成する必要があります。

@Override 
protected void onPostExecute(StringBuilder stringBuilder) { 
    try { 
     JSONObject jsonObject = new JSONObject(stringBuilder.toString()); 
     JSONArray array = jsonObject.getJSONArray("articles"); 
     for (int i = 0; i < array.length(); i++) { 
      JSONObject object = array.getJSONObject(i); 
      String title = object.getString("title"); 
      String desc = object.getString("description"); 
      String newsdata = object.getString("publishedAt"); 
      datanews = newsdata; 
      titlenotif = title; 
      destnotif = desc; 
     } 

     // Create notification here on demand 
     if(showNotification) createNotification(getApplicationContext); 
    } 
    catch (Exception e){e.printStackTrace();} 
} 

更新

コメント

からたぶん何とか ニュースの発行日を確認し、現在の日付とそれを検証し、通知を表示する必要があります。..だからあなたは ニュースがあるときだけ通知を表示する必要があります

新しいニュースをクライアント側からのみ追跡する予定の場合は、ローカルストレージを保持し、新しいニュースが到着したかどうかを毎回確認するなど、多くのコーディングを行う必要があります。ここではサーバー側の実装が必要です。新しいニュースを受け取ったら、プッシュ通知を送信します。サーバーは、同期やその他のメカニズムを処理する必要があります。

+0

ニュースがあったときにのみnotifuユーザーにしたい。 – Simon

+0

ニュースの公開日を確認し、現在の日付で確認し、通知を表示する必要があるかもしれません。あなたはニュースがあるときだけ通知を表示する必要があります – Simon

+0

答えが役立つならば、更新された回答とupvoteを見てください。 –

関連する問題