Mar*_*rie 8 service android background
我创建了一个简单的Android应用程序,用于测试如何使用处理程序或处理程序将数据从后台服务/线程传递到除创建后台服务的MainActivity之外的其他一些活动.我已经在MainActivity中使用了服务,线程和处理程序.最后一步是获取处理程序以将数据传递给除MainActivity之外的其他活动.我可以让服务将消息传递给MainActivity的处理程序,但我不知道如何让它将数据传递给其他一些活动.
为什么有人想要这样做?我认为这与一个简单的MP3播放器相比,但实际上它与一个不错的FM收音机相比.MainActivity使用后台服务,允许我选择FM电台.当我启动Play活动时,它应该绑定到相同的后台服务,这样我就可以继续听,而它(好的部分)显示音频的图形均衡器或动画.基本上,我不知道如何从多个活动绑定到后台服务.
我的代码最初基于Pro Android 2中的服务示例页面304,并且受到CommonsWare示例应用程序的极大帮助.
请查看我目前的代码.它由三个经过仔细评论的文件组成,这些文件描述了我正在尝试做的事情以及除了MainActivity之外我将数据传递给其他一些活动的困难:
/**************************************************************************************************
* File: MainActivity.java
* Application: BackgroundService
* Description: This file contains the main activity that is run when the BackgroundService
* application is launched.
**************************************************************************************************/
package com.marie.mainactivity;
import com.marie.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 starts 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";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d(TAG, "starting service");
/*
* The bind button: bindBtn
* Clicking this button starts the background Service and launches the
* RcvMessages activity. NOTE: RcvMessages is only a stub so far.
*/
Button bindBtn = (Button)findViewById(R.id.bindBtn);
bindBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// Start the background Service for sending canned messages to the handler as a test.
Intent backgroundService = new Intent(MainActivity.this, com.marie.mainactivity.BackgroundService.class);
backgroundService.putExtra(BackgroundService.EXTRA_MESSENGER, new Messenger(handler));
startService(backgroundService);
// Start the RcvMessages activity to receive messages from the handler. But how???
Intent messages = new Intent(MainActivity.this, com.marie.mainactivity.RcvMessages.class);
startActivity(messages);
}
});
/*
* The unbind button: unbindBtn
* Clicking this button stops the background Service.
*/
Button unbindBtn = (Button)findViewById(R.id.unbindBtn);
unbindBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// 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() {
@Override
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.marie.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 onStart() 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.marie.mainactivity.EXTRA_MESSENGER";
private Messenger messenger;
@Override
public void onCreate() {
super.onCreate();
notificationMgr = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
displayNotificationMessage("starting Background Service");
Thread thr = new Thread(null, new ServiceWorker(), "BackgroundService");
thr.start();
}
/*
* 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.
}
}
@Override
public void onDestroy()
{
displayNotificationMessage("stopping Background Service");
super.onDestroy();
}
/*
* onStart is where we get our reference the Messenger that allows
* us to send messages to the handler defined in the MainActivity class.
*/
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Bundle extras = intent.getExtras();
messenger = (Messenger)extras.get(EXTRA_MESSENGER);
}
@Override
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.marie.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. */
@Override
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");
}
}
Run Code Online (Sandbox Code Playgroud)
除了创建backgraound服务的MainActivity之外,任何使用后台服务,线程和处理程序将数据传递给其他活动的帮助都将非常感激.
它Handler与特定的线程相关联,因此只要您在UI线程中创建它,您需要做的就是共享处理程序.我会把你的处理程序放在我的Application班级.Messenger如果你愿意,你可以把整个放在那里.然后你可以通过任何活动访问处理程序((MyApplication)getApplication()).getHandler().当活动开始或暂停时,您可以将其注册为回调.
所以这样的事情
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;
}
}
Run Code Online (Sandbox Code Playgroud)
在任何需要通过信使接收请求的活动中
public class MyActivity extends Activity implements Handler.Callback
......
public void onStart() {
((MyApplication)getApplication()).setCallback(this);
}
public void onPause() {
((MyApplication)getApplication()).setCallback(null);
}
public void handleMessage(Message msg) {
//.... Do stuff ....
}
Run Code Online (Sandbox Code Playgroud)
}
这只是一个想法.您可能需要根据需要进行调整.
并且不要忘记MyApplication在AndroidManifest.xml中设置名称
| 归档时间: |
|
| 查看次数: |
3544 次 |
| 最近记录: |