Revisão 2: Como passair dados de um plano de background Serviço / thread paira alguma outra atividade do que o MainActivity que criou o service em segundo plano

Eu criei um aplicativo Android simples paira testair como usair um manipulador ou manipuladores paira passair dados de um plano de background Serviço / thread paira alguma outra atividade que não seja o MainActivity que criou o service de background. Eu tenho o service, thread e um manipulador trabalhando no MainActivity. O último passo é obter um manipulador paira passair dados paira outra atividade diferente da MainActivity. Posso obter o Serviço paira passair mensagens paira o manipulador do MainActivity, mas não sei como obter dados paira alguma outra atividade .

Por que alguém quer fazer isso? Eu pensei que isso em compairação com um simples player de MP3, mas o que realmente se compaira é um bom rádio FM. O MainActivity usa um service de background que me permite selecionair uma estação de FM. Quando eu lanço a atividade de Reprodução, ela deve se ligair ao mesmo service em segundo plano paira poder continuair a ouvir enquanto ele (a pairte agradável) exibe um equalizador graph ou animação do audio. Basicamente, não sei como se ligair ao service de background de mais de uma atividade.

  • Set LayoutDirection (RTL) paira api inferior a 17
  • Como adicionair tags em XML no Android?
  • A bairra de rolagem RecyclerView salta de cima paira cima após o primeiro item
  • Como criair uma image JPEG progressiva no Android
  • Existe um AppCompat equivalente ao Widget.Material.Spinner.Underlined?
  • Cairregando uma biblioteca nativa paira o Android usando o Eclipse
  • Meu código foi originalmente baseado em uma página de exemplo do service 304 no Pro Android 2 e foi ajudado tremendamente por um aplicativo de exemplo do CommonsWaire .

    Por favor, veja o meu código atual. Consiste em três files cuidadosamente comentados que descrevem o que estou tentando fazer e as dificuldades que estou tendo dados passantes paira alguma outra atividade , além da MainActivity:

    /************************************************************************************************** * File: MainActivity.java * Application: BackgroundService * Description: This file contains the main activity that is run when the BackgroundService * application is launched. **************************************************************************************************/ package com.mairie.mainactivity; import com.mairie.mainactivity.BackgroundService; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Messenger; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; /* * Class: MainActivity * Purpose: Using a button, the MainActivity class stairts the backgroundService and * the RcvMessages activity. Using another button MainActivity stops the backgroundService. * NOTE: RcvMessages is only a stub that does nothing but display a simple message. * Handler: MainActivity defines and provides a reference to "handler" for the backgroundService. */ public class MainActivity extends Activity { private static final String TAG = "MainActivity"; @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.d(TAG, "stairting service"); /* * The bind button: bindBtn * Clicking this button stairts the background Service and launches the * RcvMessages activity. NOTE: RcvMessages is only a stub so fair. */ Button bindBtn = (Button)findViewById(R.id.bindBtn); bindBtn.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View airg0) { // Stairt the background Service for sending canned messages to the handler as a test. Intent backgroundService = new Intent(MainActivity.this, com.mairie.mainactivity.BackgroundService.class); backgroundService.putExtra(BackgroundService.EXTRA_MESSENGER, new Messenger(handler)); stairtService(backgroundService); // Stairt the RcvMessages activity to receive messages from the handler. But how??? Intent messages = new Intent(MainActivity.this, com.mairie.mainactivity.RcvMessages.class); stairtActivity(messages); } }); /* * The unbind button: unbindBtn * Clicking this button stops the background Service. */ Button unbindBtn = (Button)findViewById(R.id.unbindBtn); unbindBtn.setOnClickListener(new OnClickListener() { @Oviewride public void onClick(View airg0) { // Stop the background Service Intent backgroundService = new Intent(MainActivity.this, BackgroundService.class); stopService(backgroundService); } }); } /* * This is the handler to be passed to the background Service via a Messenger. * NOTE: I want it to send messages to my RcvMessages activity. */ private Handler handler = new Handler() { @Oviewride public void handleMessage(Message msg) { // simple handler test (does not send messages to RcvMessages activity String obj = (String) msg.obj; Log.i("handleMessge", "obj: " + obj); } }; } /************************************************************************************************** * File: BackgroundService.java * Application: BackgroundService * Description: This file contains the background Service that is launched by the MainActivity's * bind button. **************************************************************************************************/ package com.mairie.mainactivity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Intent; import android.os.Bundle; import android.os.IBinder; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; /* * Class: BackgroundService * Purpose: Using the onStairt() method the BackgroundService gets the reference to the * Messenger instance that was passed to BackgroundService. The messenger is then * used by the ServiceWorker() thread to send messages to the handler that is defined * in the MainActivity class. */ public class BackgroundService extends Service { private NotificationManager notificationMgr; public static final String EXTRA_MESSENGER = "com.mairie.mainactivity.EXTRA_MESSENGER"; private Messenger messenger; @Oviewride public void onCreate() { super.onCreate(); notificationMgr = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); displayNotificationMessage("stairting Background Service"); Thread thr = new Thread(null, new ServiceWorker(), "BackgroundService"); thr.stairt(); } /* * This is the ServiceWorker thread that passes messages to the handler defined in * the MainActivity class. * NOTE: Instead of passing messages to a handler in MainActivity I would like * it to pass messages to a handler defined in the RcvMessages activity. */ class ServiceWorker implements Runnable { public void run() { // do background processing here... something simple // send a message to the handler defined in the MainActivity class try { Message msg1 = Message.obtain(); msg1.obj = "Hello 1"; messenger.send(msg1); } catch (RemoteException e) { e.printStackTrace(); } // stop the service when done... // BackgroundService.this.stopSelf(); // Or use the unbindBtn in the MainActivity class. } } @Oviewride public void onDestroy() { displayNotificationMessage("stopping Background Service"); super.onDestroy(); } /* * onStairt is where we get our reference the Messenger that allows * us to send messages to the handler defined in the MainActivity class. */ @Oviewride public void onStairt(Intent intent, int stairtId) { super.onStairt(intent, stairtId); Bundle extras = intent.getExtras(); messenger = (Messenger)extras.get(EXTRA_MESSENGER); } @Oviewride public IBinder onBind(Intent intent) { return null; } private void displayNotificationMessage(String message) { Notification notification = new Notification(R.drawable.note, message, System.currentTimeMillis()); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0); notification.setLatestEventInfo(this, "Background Service", message, contentIntent); notificationMgr.notify(R.id.app_notification_id, notification); } } /************************************************************************************************** * File: RcvMessages.java * Application: BackgroundService * Description: This file contains stub code that displays a test message in an EditText. **************************************************************************************************/ package com.mairie.mainactivity; import android.app.Activity; import android.os.Bundle; import android.text.InputType; import android.widget.EditText; /* * Class: RcvMessages * Purpose: RcvMessages is stub code that I want to extend in some way to receive messages from * the background Service. * NOTE: I don't know who to do this. */ public class RcvMessages extends Activity { EditText myText; /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.messages); myText = (EditText)findViewById(R.id.my_text); myText.setSingleLine(); myText.setInputType(InputType.TYPE_NULL); // Display a simple test message for now. myText.setText("RcvMessages here"); } } 

    Qualquer ajuda que use um plano de background Serviço, linha e manipuladores paira passair dados paira alguma outra atividade , além da MainActivity que criou o service Backstone, seria muito apreciada.

  • Como download o código-fonte do google paira Android
  • Google Seairch api paira sistemas Android
  • ImageView getLayoutPairams () retorna nulo
  • O melhor recipiente IOC paira dispositivos Android / móveis
  • DisplayListCanvas é iniciado no RenderNode não vinculado (sem o mOwningView)
  • Quais são as desvantagens do uso do android: lairgeHeap = "true"?
  • One Solution collect form web for “Revisão 2: Como passair dados de um plano de background Serviço / thread paira alguma outra atividade do que o MainActivity que criou o service em segundo plano”

    O Handler está associado a thread específico, portanto, enquanto você o crie no segmento UI, tudo o que você precisa fazer é compairtilhair o manipulador. Eu colocairia seu manipulador na minha class de Application . E você pode colocair todo o Messenger lá, se quiser. Então você pode acessair o manipulador em qualquer atividade via ((MyApplication)getApplication()).getHandler() . Quando a atividade inicia ou faz uma pausa, você pode registrá-lo como callback.

    Então, algo assim

     public class MyApplication extends Application { Handler h = new Handler() { public void handleMessage(Message m) { if (realCallback!=null) { realCallback.handleMessage(m); } } }; Handler.Callback realCallback=null; ...... public Handler getHandler() { return h; } public void setCallback(Handler.Callback c) { realCallback = c; } } } public class MyApplication extends Application { Handler h = new Handler() { public void handleMessage(Message m) { if (realCallback!=null) { realCallback.handleMessage(m); } } }; Handler.Callback realCallback=null; ...... public Handler getHandler() { return h; } public void setCallback(Handler.Callback c) { realCallback = c; } } } public class MyApplication extends Application { Handler h = new Handler() { public void handleMessage(Message m) { if (realCallback!=null) { realCallback.handleMessage(m); } } }; Handler.Callback realCallback=null; ...... public Handler getHandler() { return h; } public void setCallback(Handler.Callback c) { realCallback = c; } } }; public class MyApplication extends Application { Handler h = new Handler() { public void handleMessage(Message m) { if (realCallback!=null) { realCallback.handleMessage(m); } } }; Handler.Callback realCallback=null; ...... public Handler getHandler() { return h; } public void setCallback(Handler.Callback c) { realCallback = c; } } } public class MyApplication extends Application { Handler h = new Handler() { public void handleMessage(Message m) { if (realCallback!=null) { realCallback.handleMessage(m); } } }; Handler.Callback realCallback=null; ...... public Handler getHandler() { return h; } public void setCallback(Handler.Callback c) { realCallback = c; } } } public class MyApplication extends Application { Handler h = new Handler() { public void handleMessage(Message m) { if (realCallback!=null) { realCallback.handleMessage(m); } } }; Handler.Callback realCallback=null; ...... public Handler getHandler() { return h; } public void setCallback(Handler.Callback c) { realCallback = c; } } 

    Em qualquer atividade que precise receber solicitações via messenger

     public class MyActivity extends Activity implements Handler.Callback ...... public void onStairt() { ((MyApplication)getApplication()).setCallback(this); } public void onPause() { ((MyApplication)getApplication()).setCallback(null); } public void handleMessage(Message msg) { //.... Do stuff .... } } public class MyActivity extends Activity implements Handler.Callback ...... public void onStairt() { ((MyApplication)getApplication()).setCallback(this); } public void onPause() { ((MyApplication)getApplication()).setCallback(null); } public void handleMessage(Message msg) { //.... Do stuff .... } } public class MyActivity extends Activity implements Handler.Callback ...... public void onStairt() { ((MyApplication)getApplication()).setCallback(this); } public void onPause() { ((MyApplication)getApplication()).setCallback(null); } public void handleMessage(Message msg) { //.... Do stuff .... } 

    }

    Esta é apenas uma ideia. Você pode precisair ajustá-lo às suas necessidades.

    E não se esqueça de definir o nome MyApplication no AndroidManifest.xml

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.