2011-11-01 15 views
5

Wiem, jest ich mnóstwo tutaj, ale próbowałem rozwiązania przez cały dzień i nigdzie się nie dostałem. Ani przykład na dokumentach Google, ani żaden z 5 innych sposobów, które tu znalazłem, w ogóle dla mnie działały. Podobnie jak w przypadku typowym, po kliknięciu powiadomienia zamyka się pasek stanu i nic nowego nie jest wyświetlane na ekranie. Tworzę powiadomienie z usługi i chcę, aby powiadomienie wywołało nowe działanie, które nie zostało jeszcze utworzone. Potrzebuję też sposobu na przekazanie informacji do tego działania za pomocą intencji.uruchamianie z usługi po kliknięciu powiadomienia

I tak ... to jest Java dla Androida

co za tym idzie są rozbitej resztki mojego kodu.

package com.bobbb.hwk2; 

import java.io.FileOutputStream; 

import android.app.Notification; 
import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.app.Service; 
import android.content.ContentResolver; 
import android.content.Context; 
import android.content.Intent; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.IBinder; 
import android.provider.ContactsContract; 
import android.widget.Toast; 

public class contactBackup extends Service 
{ 
    private NotificationManager nManager; 
    private static final int NOTIFY_ID = 1100; 

    @Override 
    public void onCreate() 
    { 
     super.onCreate(); 

     String ns = Context.NOTIFICATION_SERVICE; 
     nManager = (NotificationManager)getSystemService(ns); 
    } 

    @Override 
    public void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 

     // inform user that service has started 
     Toast.makeText(getApplicationContext(), R.string.service_started,Toast.LENGTH_LONG).show(); 

     String data = lookUpContacts(); 
     if(saveToSDCard(getResources().getString(R.string.backup_file_name),data)) 
     { 
      Context context = getApplicationContext(); 

      // create the statusbar notification 
      Intent nIntent = new Intent(this,contactViewer.class);//Intent nIntent = new Intent(Intent.ACTION_MAIN); 
      nIntent.setClass(context,contactViewer.class); 
      //nIntent.putExtra("data",data); 


      Notification msg = new Notification(R.drawable.icon,"All contacts records have been written to the file.",System.currentTimeMillis()); 
      // start notification 
      //PendingIntent pIntent = PendingIntent.getService(getApplicationContext(),0,nIntent,PendingIntent.FLAG_UPDATE_CURRENT|Intent.FLAG_FROM_BACKGROUND); 
      PendingIntent pIntent = PendingIntent.getActivity(this,0,nIntent,0); 
      msg.flags = Notification.FLAG_AUTO_CANCEL; 
      msg.setLatestEventInfo(context, 
            "success", 
            "All contacts records have been written to the file.", 
            pIntent); 
      nManager.notify(NOTIFY_ID,msg); 


     } 



    } 

    @Override 
    public void onDestroy() 
    { 
     nManager.cancel(NOTIFY_ID); 
     super.onDestroy(); 
    } 

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

    // function returns string containing information 
    // from contacts 
    public String lookUpContacts() 
    { 
     ... 
    } 

    public boolean saveToSDCard(String fileName, String data) 
    { 
     ... 
    } 

} 

mogę tylko mieć nadzieję, że wszystko, co jest przyczyną mojego problemu jest coś naprawić i nie więcej szalonych trzasków ja dostaję z Eclipse (co wydaje się nikt inny by kiedykolwiek widziałem>: U)

Jeśli możesz mi pomóc rozwiązać ten problem, udostępnij. Jeśli nie możesz pomóc z tym konkretnym problemem, ale czuję się zobowiązany powiedzieć niepowiązanych rzeczy o delegowaniu, stylów, tematów lub dobrej praktyki, to nie

Dziękuję: D

Odpowiedz

6

Edit:

będziesz musiał dodać flagę dla FLAG_ACTIVITY_NEW_TASK:

nIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

to dlatego, że jesteś uruchomienie od outsi de twojej aplikacji (z paska powiadomień systemu).

+0

dobrze , tak naprawdę nie używasz putExtra ... Ale w oparciu o twoją radę próbowałem addi Ta flaga oznaczała zarówno zamiar, jak i oczekiwanie i żadna z nich nie zrobiła żadnej różnicy. W każdym razie dzięki. – user980058

+0

Twoja edycja pasuje do tego, co zrobiłem. nadal nie ma kości: 3 – user980058

0

Tak dzieje się, gdy ludzie przepracowują się. XD Jedyny powód, dla którego żaden ze sprawdzonych przeze mnie samouczków nie zadziałał, polega na tym, że błędnie wpisałem nazwę mojej działalności w manifeście. Dzięki za zatrzymanie się

0

Wystarczy dodać następujący w contactBackup (klasa usługi),

Intent nIntent = new Intent(this,contactViewer.class);//Intent nIntent = new Intent(Intent.ACTION_MAIN); 
     nIntent.setClass(context,contactViewer.class); 
     nIntent.putExtra("data",data); 

    nIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     Notification msg = new Notification(R.drawable.icon,"All contacts records have been written to the file.",System.currentTimeMillis()); 
     // start notification 
     //PendingIntent pIntent = PendingIntent.getService(getApplicationContext(),0,nIntent,PendingIntent.FLAG_UPDATE_CURRENT|Intent.FLAG_FROM_BACKGROUND); 
     PendingIntent pIntent = PendingIntent.getActivity(this,0,nIntent,0); 
     msg.flags = Notification.FLAG_AUTO_CANCEL; 
     msg.setLatestEventInfo(context, 
           "success", 
           "All contacts records have been written to the file.", 
           pIntent); 
     nManager.notify(NOTIFY_ID,msg); 

następnie uzyskać wartość w klasie contactViewer,

jak

String s=getIntent().getStringExtra("data"); 
Powiązane problemy