2014-07-29 6 views
0

Когда пользовательское уведомление просматривает на рабочем столе, система отображает его со стандартным шаблоном, который он генерирует из семантических данных уведомления. Мне нужно прокрутить уведомление, чтобы увидеть пользовательскую активность для уведомления. Я показываю текст «Проведите вверх, чтобы просмотреть» в качестве названия стандартного шаблона. Мой вопрос: могу ли я заменить «Проведите вверх по просмотру» счетчиком времени, который увеличивается с помощью таймера?Пользовательские уведомления Android Wear

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    String ns = getApplicationContext().NOTIFICATION_SERVICE; 
    mNotificationManager = (NotificationManager) getSystemService(ns); 
    callNotification(Html.fromHtml(getFormattedTime(CurrentPausedTime)),false,false); 
    Thread notifyingThread = new Thread(null, updateTimerTaskCustom, "NotifyingServiceNew"); 
    notifyingThread.start(); 

} 
private void callNotification(final Spanned spanned,boolean isPause,boolean pauseAction) { 
    // TODO Auto-generated method stub 

    displayIntent = new Intent(getApplicationContext(), CustomNotification.class); 
    displayIntent.putExtra("exerciseTitle", "Running"); 
    displayIntent.putExtra("duration", CurrentPausedTime); 
    displayIntent.putExtra("elepsedTime", 0); 
    displayIntent.putExtra("isPause", isPause); 

    displayPendingIntent = PendingIntent.getActivity(getApplicationContext(), 
      0, displayIntent, PendingIntent.FLAG_UPDATE_CURRENT); 


    Intent deleteIntent = new Intent(getApplicationContext(), ClearNotification.class); 
    deletePendingIntent = PendingIntent.getActivity(getApplicationContext(), 
      0, deleteIntent, PendingIntent.FLAG_UPDATE_CURRENT); 


    Intent pauseIntent = new Intent(ExerciseActionReciever.ACTION_PAUSE, 
      null,getApplicationContext(), ExerciseActionReciever.class); 
    pausePendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 
      0, pauseIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

    Intent stopIntent =new Intent(ExerciseActionReciever.ACTION_STOP, 
      null,getApplicationContext(), ExerciseActionReciever.class); 
    stopPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 
      0, stopIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    Intent resumeIntent = new Intent(ExerciseActionReciever.ACTION_RESUME, 
      null, getApplicationContext(), ExerciseActionReciever.class); 
    resumePendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, resumeIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

    NotificationCompat.WearableExtender wearableExtender = 
       new NotificationCompat.WearableExtender() 
       .setHintHideIcon(true) 
       .setContentIcon(R.drawable.icon) 
       .setDisplayIntent(displayPendingIntent); 


     mNotifyBuilder = 
       new NotificationCompat.Builder(getApplicationContext()) 
     .setSmallIcon(R.drawable.icon) 
     .setContentTitle(""+spanned) 
     .setDeleteIntent(deletePendingIntent) 
     .extend(wearableExtender) 
     .addAction(R.drawable.icon, "Resume", resumePendingIntent) 
     .addAction(R.drawable.icon, "Stop", stopPendingIntent); 

} 

private Runnable updateTimerTaskCustom = new Runnable() { 

    public void run() { 
     timerHandlerCustom.removeCallbacks(updateTimerTaskCustom); 
     timerHandlerCustom.postDelayed(updateTimerTaskCustom, 1000); 
     if(!CustomNotification.isCustomCardAcrivityvisible) 
     { 
      CurrentPausedTime = CurrentPausedTime+1000; 
      mNotifyBuilder.setContentTitle(""+Html.fromHtml(getFormattedTime(CurrentPausedTime))); 
      mNotificationManager.notify(NOTIFICTIONTION_ID , mNotifyBuilder.build());   

     } 

    } 

}; 
+0

Вышеуказанный код представляет собой активность, с которой я обновляю уведомление. – Manu

+0

Вы отправили часть кода (кстати, у него есть синтаксические ошибки), но вопрос один и тот же (и на мой ответ уже ответили - я также протестировал мой asolution, и он работает так, как должен). Если у вас возникли проблемы с нежелательными результатами, опишите их где-нибудь.Также нет места, где вы переключаете флаг isCustomCardAcrivityvisible. Другое дело: почему вы используете 'notifyingThread'' Thread', если после этого вы замените его' timerHandlerCustom'' Handler' ... –

ответ

1

Вы можете заменить «Проведите по экрану» любым желаемым текстом - например, «53 сек». Чтобы обновить это значение, вам нужно просто обновить уведомление.

Более подробная информация об обновлении уведомлений: http://developer.android.com/training/notify-user/managing.html

BTW. Если вы хотите оптимизировать свой код банкнот сверху может быть важным для вас:

Если вам необходимо оформить соответствующее уведомление несколько раз для того же типа события, вы должны избегать создания совершенно нового уведомления. Вместо этого вы должны рассмотреть возможность обновления предыдущего уведомления, либо , изменив некоторые его значения, либо добавив к нему, или и то, и другое.

EDIT: Если вы хотите, кроме того, чтобы использовать это решение с пользовательским макетом Activity необходимо предотвратить уведомление от освежающих когда Activity видна. В противном случае вы получите Activity, создаваемое снова и снова (мигающий макет). Пользовательский Activity в макете карты отображается между onResume и событиями, поэтому вам необходимо обнаружить это и обновить все уведомление ТОЛЬКО, когда Activity НЕ отображается пользователю. Самый простой способ - использовать статический флаг, но вы также можете играть с другими более продвинутыми решениями (например, LocalBroadcastManager и т. Д.) Для достижения этой цели.

public class CustomLayoutActivity extends Activity { 

    public static boolean isCustomCardAcrivityvisible; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.custom_layout_activity); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     isCustomCardAcrivityvisible = true; 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     isCustomCardAcrivityvisible = false; 
    } 
} 

и если вы собираетесь обновить уведомление просто следующие проверки:

if(!CustomLayoutActivity.isCustomCardAcrivityvisible) { 
     updateNotification(); 
    } 

В качестве альтернативы вы можете использовать setUsesChronometer(boolean b) метод, чтобы просто отображать таймер (вместо contextText), который будет обновлен для вас, но обратите внимание, что таймер будет отображаться только (на Android Wear), если вы НЕ установите пользовательский макет на свою карту. Поэтому, хотя это не совсем то, что вы хотите, вы можете рассмотреть это вместо этого.

Показать поле when в качестве секундомера. Вместо того, чтобы представлять, когда в качестве метки времени , уведомление покажет автоматически обновляемое отображение минут и секунд с тех пор. Полезно при показе прошедшего времени (например, текущий телефонный звонок).

+0

Любая идея, почему моя пользовательская активность уведомления мигает при обновлении ??? – Manu

+0

Это потому, что 'Activity' внутри вашего настраиваемого макета создается снова и снова. Я думаю, что это невозможно предотвратить, но вы можете справиться с этим сами. Если ваша «активность» видна (между 'onResume' и' onPause'), вы должны просто обновить контент активности, а не обновлять все уведомление, потому что стандартный шаблон уведомления не отображается в любом случае. Если действие приостановлено, вам необходимо обновить уведомление. –

+0

Но onCreate, onPause и onResume все получают вызов everytime :-( – ranjith

Смежные вопросы