Java Android LocalBroadcast管理器onReceive不工作
我尝试在android服务类中使用localbroadcastreceivers。但是当它运行时,主活动中的onReceive方法不会被调用。我看了几个例子和教程,但没有发现问题 主要活动Java Android LocalBroadcast管理器onReceive不工作,java,android,android-broadcastreceiver,localbroadcastmanager,Java,Android,Android Broadcastreceiver,Localbroadcastmanager,我尝试在android服务类中使用localbroadcastreceivers。但是当它运行时,主活动中的onReceive方法不会被调用。我看了几个例子和教程,但没有发现问题 主要活动 BroadcastReceiver receiver; @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); Loca
BroadcastReceiver receiver;
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
LocalBroadcastManager.getInstance(this).registerReceiver((receiver),
new IntentFilter(TestService.COPA_MESSAGE)
);
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
super.onStop();
}
onCreate方法
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String s = intent.getStringExtra(TestService.COPA_MESSAGE);
Toast.makeText(getApplicationContext(),"Result - " + s, Toast.LENGTH_LONG).show();
System.out.println("Result - " + s);
// do something here.
}
};
测试服务类
LocalBroadcastManager broadcaster;
static final public String COPA_RESULT = "com.controlj.copame.backend.COPAService.REQUEST_PROCESSED";
static final public String COPA_MESSAGE = "com.controlj.copame.backend.COPAService.COPA_MSG";
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
public void sendResult(String message) {
Intent intent = new Intent(COPA_RESULT);
if(message != null)
intent.putExtra(COPA_MESSAGE, message);
broadcaster.sendBroadcast(intent);
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "Service Created", 1).show();
broadcaster = LocalBroadcastManager.getInstance(this);
super.onCreate();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "Service Destroy", 1).show();
super.onDestroy();
}
public void sendResult(String message) {
Intent intent = new Intent(COPA_RESULT);
if(message != null)
intent.putExtra(COPA_MESSAGE, message);
broadcaster.sendBroadcast(intent);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "Service Running ", 1).show();
class HttpAsync extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
String result = null;
MyDefaultHttpClient client = MyDefaultHttpClient.getInstance();
HttpPost httpPost = new HttpPost("url");
try {
List<NameValuePair> data = new ArrayList<NameValuePair>();
data.add(new BasicNameValuePair("mob_no", "0112888788"));
httpPost.setEntity(new UrlEncodedFormEntity(data));
HttpResponse responce = client.execute(httpPost);
InputStream in = responce.getEntity().getContent();
BufferedReader br = new BufferedReader(
new InputStreamReader(in));
StringBuilder responceStr = new StringBuilder();
String responceLineStr = null;
while ((responceLineStr = br.readLine()) != null) {
responceStr.append(responceLineStr);
}
br.close();
in.close();
result = responceStr.toString();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if ((result != null) || (result != "")){
System.out.println("Myresult"+ result);
try {
sendResult("My Test");
PushNotification(getApplicationContext());
String recData[] = result.split("#");
System.out.println("Moblile "+ recData[0]);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
HttpAsync a = new HttpAsync();
a.execute();
return super.onStartCommand(intent, flags, startId);
}
LocalBroadcastManager广播公司;
静态最终公共字符串COPA_RESULT=“com.controlj.copame.backend.COPAService.REQUEST_PROCESSED”;
静态最终公共字符串COPA_MESSAGE=“com.controlj.copame.backend.COPAService.COPA_MSG”;
@凌驾
公共IBinder onBind(意向){
//TODO:将通信通道返回到服务。
抛出新的UnsupportedOperationException(“尚未实现”);
}
公共void sendResult(字符串消息){
意向意向=新意向(COPA_结果);
如果(消息!=null)
意向书(COPA_报文,报文);
广播者。发送广播(意图);
}
@凌驾
public void onCreate(){
//TODO自动生成的方法存根
Toast.makeText(getApplicationContext(),“服务已创建”,1.show();
broadcaster=LocalBroadcastManager.getInstance(this);
super.onCreate();
}
@凌驾
公共空间{
//TODO自动生成的方法存根
Toast.makeText(getApplicationContext(),“服务销毁”,1.show();
super.ondestory();
}
公共void sendResult(字符串消息){
意向意向=新意向(COPA_结果);
如果(消息!=null)
意向书(COPA_报文,报文);
广播者。发送广播(意图);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
//TODO自动生成的方法存根
Toast.makeText(getApplicationContext(),“正在运行的服务”,1.show();
类HttpAsync扩展了异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
字符串结果=null;
MyDefaultHttpClient=MyDefaultHttpClient.getInstance();
HttpPost HttpPost=新的HttpPost(“url”);
试一试{
列表数据=新的ArrayList();
添加数据(新的BasicNameValuePair(“移动编号”,“0112888788”);
setEntity(新的UrlEncodedFormEntity(数据));
HttpResponse response=client.execute(httpPost);
InputStream in=response.getEntity().getContent();
BufferedReader br=新的BufferedReader(
新的InputStreamReader(in);
StringBuilder responcest=新建StringBuilder();
字符串responceLineStr=null;
而((responceLineStr=br.readLine())!=null){
responceStr.append(responceLineStr);
}
br.close();
in.close();
结果=responceStr.toString();
}捕获(客户端协议例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回结果;
}
@凌驾
受保护的void onPostExecute(字符串结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
如果((结果!=null)| |(结果!=“”)){
System.out.println(“Myresult”+结果);
试试{
发送结果(“我的测试”);
PushNotification(getApplicationContext());
字符串recData[]=result.split(“#”);
System.out.println(“Moblile”+recData[0]);
}捕获(例外e){
e、 printStackTrace();
}
}
}
}
HttpAsync a=新的HttpAsync();
a、 执行();
返回super.onStartCommand(intent、flags、startId);
}
您应该在onResume()中注册接收者,并在onPause()中注销接收者。如API中所述:当活动对用户可见和隐藏时,可以多次调用onStart()和onStop()方法。为什么使用本地广播接收器而不是绑定的本地服务模式?@Opiatefuchs您是否建议减少调用onResume
/onPause
的频率?onPause()将在应用程序关闭或释放焦点时定义调用,onResume()将在焦点返回或应用程序将启动(或重新启动)时定义调用。不能100%保证调用onStop(),因此仅出于这个原因,就应该在onResume()/onPause()中调用它。但我的意思是,当onStop最终被调用时,接收方是未注册的。API中没有描述,但我在我的三星Galaxy S3(根目录)上看到过这种行为,最终调用了onStop()(在简单的hello world演示应用程序中)。这可能是一个错误的实现系统,但它确实存在。…@Opiatefuchs请参阅android.app.Activity
文档和^F onStop:''例如,您可以在onStart()中注册一个BroadcastReceiver来监视影响您的UI的更改,并在onStop()中注销它当用户不再看到您正在显示的内容时。“
您应该在onResume()中注册接收器,并在onPause()中注销它。如API中所述:onStart()和onStop()方法可以多次调用,因为用户可以看到和隐藏活动。为什么使用本地广播接收器而不是绑定的本地服务模式?@Opiatefuchs