Autore Topic: Button event in custom notification bar  (Letto 1825 volte)

Offline terenz84

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
Button event in custom notification bar
« il: 08 Marzo 2011, 09:13:29 CET »
0
Salve

Ho creato una custon notification e vorrei fare in modo che alla pressione del button presente nella mia notifica killi il processo che ha generato la notifica stessa. Non voglio semplicemente eliminare la notifica ma anche il thread che lavora in background.

Qualche suggerimento?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Button event in custom notification bar
« Risposta #1 il: 08 Marzo 2011, 10:12:42 CET »
0
fai in modo che quando l'utente preme sul bottone venga chiamato questo metodo:

http://developer.android.com/reference/android/app/ActivityManager.html#killBackgroundProcesses(java.lang.String)

ricordati ovviamente di inserire i dovuti permessi nel manifest

Offline terenz84

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
Re:Button event in custom notification bar
« Risposta #2 il: 08 Marzo 2011, 10:31:55 CET »
0
Quel metodo sembra proprio fare al caso mio...

il problema è che ora non funziona il button nella notification.

se provo a disegnarlo mi da un sfilza di eccezioni

Codice (Java): [Seleziona]
03-08 10:29:00.359: ERROR/StatusBar(59): couldn't inflate view for package com.PhotoBackup
03-08 10:29:00.359: ERROR/StatusBar(59): android.view.InflateException: Binary XML file line #37: Error inflating class android.widget.Button
03-08 10:29:00.359: ERROR/StatusBar(59):     at android.view.LayoutInflater.createView(LayoutInflater.java:513)
03-08 10:29:00.359: ERROR/StatusBar(59):     at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
03-08 10:29:00.359: ERROR/StatusBar(59):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
03-08 10:29:00.359: ERROR/StatusBar(59):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
03-08 10:29:00.359: ERROR/StatusBar(59):     at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
03-08 10:29:00.359: ERROR/StatusBar(59):     at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
03-08 10:29:00.359: ERROR/StatusBar(59):     at android.widget.RemoteViews.apply(RemoteViews.java:930)
03-08 10:29:00.359: ERROR/StatusBar(59):     at com.android.server.status.StatusBarService.makeNotificationView(StatusBarService.java:854)
03-08 10:29:00.359: ERROR/StatusBar(59):     at com.android.server.status.StatusBarService.addNotificationView(StatusBarService.java:881)
03-08 10:29:00.359: ERROR/StatusBar(59):     at com.android.server.status.StatusBarService.updateNotificationView(StatusBarService.java:925)
03-08 10:29:00.359: ERROR/StatusBar(59):     at com.android.server.status.StatusBarService.performAddUpdateIcon(StatusBarService.java:690)
03-08 10:29:00.359: ERROR/StatusBar(59):     at com.android.server.status.StatusBarService$H.handleMessage(StatusBarService.java:630)
03-08 10:29:00.359: ERROR/StatusBar(59):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-08 10:29:00.359: ERROR/StatusBar(59):     at android.os.Looper.loop(Looper.java:123)
03-08 10:29:00.359: ERROR/StatusBar(59):     at com.android.server.ServerThread.run(SystemServer.java:506)
03-08 10:29:00.359: ERROR/StatusBar(59): Caused by: java.lang.reflect.InvocationTargetException
03-08 10:29:00.359: ERROR/StatusBar(59):     at android.widget.Button.<init>(Button.java:65)
03-08 10:29:00.359: ERROR/StatusBar(59):     at java.lang.reflect.Constructor.constructNative(Native Method)
03-08 10:29:00.359: ERROR/StatusBar(59):     at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
03-08 10:29:00.359: ERROR/StatusBar(59):     at android.view.LayoutInflater.createView(LayoutInflater.java:500)
03-08 10:29:00.359: ERROR/StatusBar(59):     ... 14 more
03-08 10:29:00.359: ERROR/StatusBar(59): Caused by: java.lang.IllegalStateException: The android:onClick attribute cannot be used within a restricted context
03-08 10:29:00.359: ERROR/StatusBar(59):     at android.view.View.<init>(View.java:2040)
03-08 10:29:00.359: ERROR/StatusBar(59):     at android.widget.TextView.<init>(TextView.java:327)
03-08 10:29:00.359: ERROR/StatusBar(59):     at android.widget.Button.<init>(Button.java:69)
03-08 10:29:00.359: ERROR/StatusBar(59):     ... 18 more

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Button event in custom notification bar
« Risposta #3 il: 08 Marzo 2011, 10:36:11 CET »
0
Dovresti postare anche un po' di codice altrimenti diventa difficile capire il problema...

Offline terenz84

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
Re:Button event in custom notification bar
« Risposta #4 il: 08 Marzo 2011, 11:12:15 CET »
0
praticamente sono riuscito a disegnare il button

questo è il laoyut del mio custom notification
Codice (Java): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp">
       
        <ImageView
        android:id="@+id/status_icon"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_alignParentLeft="true" />

        <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_toRightOf="@id/status_icon">

                <TextView
                android:id="@+id/status_text"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true" />
               
                <ProgressBar
                android:id="@+id/status_progress"
                android:layout_width="200px"
                android:layout_height="wrap_content"
                android:layout_below="@id/status_text"
                android:progressDrawable="@android:drawable/progress_horizontal"
                android:indeterminate="false"
                android:indeterminateOnly="false" />
               
                <Button android:text="Stop"
                android:gravity="center"
                android:id="@+id/ButtonSendFeedback"
                android:layout_height="wrap_content"
                android:layout_width="50px"
                android:layout_toRightOf="@+id/status_progress"
                android:layout_alignTop="@+id/status_progress"
                android:layout_alignBottom="@+id/status_progress"></Button>  
               
               
       

</RelativeLayout>

   
</RelativeLayout>

ma non riesco ad associare l'evento del bottone
Codice (Java): [Seleziona]
           private void showNotification() {
                   notification = new Notification(R.drawable.icon, "PhotoBackup", System.currentTimeMillis());
       
                   Intent notificationIntent = new Intent(this, AccountList.class);
                   String pkg = this.getPackageName();
                   notificationIntent.putExtra(pkg+".killUpload",true);
                   
                   PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
                   
                   notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;
                   notification.contentView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.customnotificationlayout);
                   notification.contentIntent = contentIntent;
                   notification.contentView.setImageViewResource(R.id.status_icon, R.drawable.stub);
                   notification.contentView.setProgressBar(R.id.status_progress,100, progress, false);
                   
                   String totalSize = "(" + Float.toString(Util.bytesToMeg(totalImageSize)) + " Mb)";
                   notification.contentView.setTextViewText(R.id.status_text, "Upload "+sizeUploaded+" of " + totalSize);
                   mNM.notify(42, notification);
           }

se metto l'atributo onclick nel tag button nell xml del layout mi genera l'eccezione

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Button event in custom notification bar
« Risposta #5 il: 08 Marzo 2011, 11:18:10 CET »
0
Non mi convincono molto queste linee

Codice (XML): [Seleziona]
        android:layout_toRightOf="@+id/status_progress"
                android:layout_alignTop="@+id/status_progress"
                android:layout_alignBottom="@+id/status_progress"

Come fa ad essere allineata sia sopra che sotto che a destra di quella view?

Offline terenz84

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
Re:Button event in custom notification bar
« Risposta #6 il: 08 Marzo 2011, 11:32:26 CET »
0
è stato generato in automatico dal editor di layout di eclipse.

Visivamente viene bene non credo sia quello il problema..

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Button event in custom notification bar
« Risposta #7 il: 08 Marzo 2011, 11:39:26 CET »
0

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Button event in custom notification bar
« Risposta #8 il: 08 Marzo 2011, 12:07:07 CET »
0
non puoi fare android:onClick perchè è una remoteView, devi fare come ha detto ricky da codice
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline terenz84

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
Re:Button event in custom notification bar
« Risposta #9 il: 08 Marzo 2011, 12:32:09 CET »
0
ho aggiunto questa riga di codice all'interno della showNotifications

Codice (Java): [Seleziona]
notification.contentView.setOnClickPendingIntent(R.id.ButtonSendFeedback, contentIntent);
poi nell'intent di AccountList ho fatto un check:
Codice (Java): [Seleziona]
Intent intent = getIntent();
        String pkg = getPackageName();
        Boolean killUpload = intent.getBooleanExtra(pkg+".killUpload", false);
        if(killUpload){
                Toast.makeText(getApplicationContext(), "kill upload", 5).show();
                ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
                activityManager.killBackgroundProcesses(pkg);
        }

per stoppare il processo che ha lanciato la showNotification
Codice (Java): [Seleziona]
                 // Start file upload in a background thread
                final Thread uploadThread = new Thread(new Runnable() {
                     public void run() {
                         totalImageSize = getTotalSizeImageUpload();
                             showNotification();
                             Uploader uploader = new Uploader(account);
                             uploader.resetSize();
                                 for(int i = 0; i < ImageList.size() ; i++){
                                        if(ImageList.get(i).Upload && ImageList.get(i).Checked){                                       
                                                Boolean result = uploader.uploadImage(ImageList.get(i).AbsolutePath,progressHandler);
                                                if(result){
                                                        ImageList.get(i).Upload = false;
                                                        Date now = new Date();
                                                        DateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");  
                                                        ImageList.get(i).UploadDate = df.format(now).toString();
                                                }
                                }
                                 }
                                 mHandler.post(mUpdateResults);
                                 mNM.cancel(42);
                     }
                   
                 });
                uploadThread.start();

ma non funziona...
 

Offline terenz84

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
Re:Button event in custom notification bar
« Risposta #10 il: 08 Marzo 2011, 13:11:18 CET »
0
Inoltre quando clicco il button parte l'intent della notification e non quella del button

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Button event in custom notification bar
« Risposta #11 il: 08 Marzo 2011, 15:30:55 CET »
0
1) "Non funziona" non e' di molto aiuto nella risoluzione. Cerca di essere piu' dettagliato.
2) Hai assegnato al click sul bottone lo stesso intent che hai assegnato al click sulla notifica...

Offline terenz84

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
Re:Button event in custom notification bar
« Risposta #12 il: 08 Marzo 2011, 15:34:24 CET »
0
Si mi spiego meglio

O provato a fare a settare il onclick come mi avete spiegato precedentemente pero' con un intent diverso da quello della notifica.
Quando clicco sul button della notifica è come se non clicasse e prende l'intent della notifica.

Inoltre per provare se funzionava il killBackgroundProcesses l'ho messo nell'intent della notifica perö anche quest'ultimo non funziona.

Spero di essermi spiegato meglio

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Button event in custom notification bar
« Risposta #13 il: 08 Marzo 2011, 15:42:23 CET »
0
Metti dei tracciamenti per vedere se effettivamente vengono effettivamente chiamati.
Comunque se la tua applicazione e' in foreground quel metodo non la killa.
Di piu' non saprei dirti.

Offline terenz84

  • Nuovo arrivato
  • *
  • Post: 31
  • Respect: 0
    • Mostra profilo
Re:Button event in custom notification bar
« Risposta #14 il: 08 Marzo 2011, 15:45:08 CET »
0
c'è qualche altra alterativa per poter killare il thread "uploadThread "?