IntentService LocalBroadcastManager 未到达接收器
IntentService LocalBroadcastManager not reaching Receiver
我正在使用 Android Studio 1.3,我有一个 IntentService
设置可以收集一些数据并通过 LocalBroadcastManager
发送出去:
IntentService
public class cService extends IntentService {
public cService(){
super("cService");
}
@Override
protected void onHandleIntent(Intent intent) {
SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
Intent broadcastIntent = new Intent("action.getTestData");
broadcastIntent.putExtra("data", response.toString());
LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent);
}
}
以上代码运行,但从未捕获广播。
AndroidManifest.xml
<service android:name=".services.cService"
android:exported="false">
</service>
<receiver android:name=".services.Receiver">
</receiver>
扩展 BroadcastReceiver 的接收器(从不调用)
public class Receiver extends BroadcastReceiver
{
protected MainActivity mainActivityContext;
public Receiver() {}
@Override
public void onReceive(Context context, Intent intent) {
final String data = intent.getStringExtra("data");
mainActivityContext.runOnUiThread(new Runnable() {
@Override
public void run() {
TextView txtData = (TextView)mainActivityContext.findViewById(R.id.textView2);
txtData.setText(data);
}
});
}
}
MainActivity onCreate()
public class MainActivity extends Activity implements View.OnClickListener{
TextView txtData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Dummy text field that should populate with something upon
//onReceive() executing...
txtData = (TextView)findViewById(R.id.textView2);
txtData.setText("Ready.");
IntentFilter filter = new IntentFilter("action.getTestData");
filter.addDataScheme("string");
BroadcastReceiver c = new Receiver();
LocalBroadcastManager.getInstance(this).registerReceiver(c,filter);
}
我做错了什么导致收不到广播?我认为这与我的 IntentFilter
?
有关
您可以尝试在 XML 的 <service>
块中设置 android:exported=true
。根据文档:
http://developer.android.com/guide/topics/manifest/service-element.html#exported
The default value depends on whether the service contains intent filters. The absence of any filters means that it can be invoked only by specifying its exact class name. This implies that the service is intended only for application-internal use (since others would not know the class name). So in this case, the default value is "false". On the other hand, the presence of at least one filter implies that the service is intended for external use, so the default value is "true".
希望对您有所帮助。
试试这个:
IntentFilter filter = new IntentFilter(cService.class);
filter.addCategory(Intent.CATEGORY_DEFAULT);
Receiver receiver = new Receiver();
registerReceiver(receiver, filter);
我通过将 BroadcastReceiver
合并到 MainActivity
的 onResume()
中,设法解决了我遇到的问题。我的目标是在 Service
完成检索所有网络数据后简单地捕获该数据。
我希望这对某人有所帮助...
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.Button;
public class MainActivity extends Activity implements View.OnClickListener {
private boolean isReceiverRegistered;
private Button btnRetrieveRouteData;
private BroadcastReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//UI Component Instances
btnRetrieveRouteData = (Button)findViewById(R.id.btnGetRouteInformation);
btnRetrieveRouteData.setOnClickListener(this);
}
@Override
protected void onResume(){
super.onResume();
if (!isReceiverRegistered) {
IntentFilter intentFilter = new IntentFilter("ma.MainActivity.WebServiceReceiver.ReturnedReceivedDataFilePath");
receiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, Intent intent) {
//Get message from WebServiceReceiver Intent
String ReceivedDataFromIntent = intent.getStringExtra("WebServiceReceiver_ReturnedReceivedDataFilePath");
//Do whatever with the data received from the Service...
}
};
//Register the receiver
isReceiverRegistered = true;
this.registerReceiver(receiver, intentFilter);
}
}
@Override
protected void onPause(){
super.onPause();
if (isReceiverRegistered) {
try {
unregisterReceiver(receiver);
} catch (IllegalArgumentException e) {
//Handle Exception as needed...
}
isReceiverRegistered = false;
}
}
@Override
public void onDestroy(){
super.onDestroy();
}
public void onClick(View view){
switch(view.getId()){
case R.id.btnGetRouteInformation:
CallWebService("testParam1", "testParam2");
break;
default:
//Do nothing
break;
}
}
private void CallWebService(String param1, String param2){
//Begin web call to retrieve necessary data.
ServerCaller.GetRequestForRouteWithDriverId(this, param1, param2);
//WebServiceReceiver will get this returned data and broadcast it; received in "onResume()" here.
}
}
然后我有另一个 classe 叫做 WebServiceReceiver
,这个 class 将处理来自网络服务的结果,它将准备数据然后创建我们的 onResume()
Override 方法将过滤并读入。
public class WebServiceReceiver extends BroadcastReceiver
{
public WebServiceReceiver() {}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("Helper_GetRequestForData")){
//Retrieve the data from incoming Intent that web service submitted
final String ReceivedDataFilePathThatContainsData = intent.getStringExtra("Helper_GetRequestForData");
Intent responder = new Intent("ma.MainActivity.WebServiceReceiver.ReturnedReceivedDataFilePath");
responder.putExtra("WebServiceReceiver_ReturnedReceivedDataFilePath", ReceivedDataFilePathThatContainsData);
context.sendBroadcast(responder);
}
}
}
更换后一切开始为我工作
registerReceiver(receiver, filter);
和
LocalBroadcastManager.getInstance(this).registerReceiver(receiver, filter);
同上。当然,这仅适用于您使用应用程序内部的本地服务的情况。
我正在使用 Android Studio 1.3,我有一个 IntentService
设置可以收集一些数据并通过 LocalBroadcastManager
发送出去:
IntentService
public class cService extends IntentService {
public cService(){
super("cService");
}
@Override
protected void onHandleIntent(Intent intent) {
SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
Intent broadcastIntent = new Intent("action.getTestData");
broadcastIntent.putExtra("data", response.toString());
LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent);
}
}
以上代码运行,但从未捕获广播。
AndroidManifest.xml
<service android:name=".services.cService"
android:exported="false">
</service>
<receiver android:name=".services.Receiver">
</receiver>
扩展 BroadcastReceiver 的接收器(从不调用)
public class Receiver extends BroadcastReceiver
{
protected MainActivity mainActivityContext;
public Receiver() {}
@Override
public void onReceive(Context context, Intent intent) {
final String data = intent.getStringExtra("data");
mainActivityContext.runOnUiThread(new Runnable() {
@Override
public void run() {
TextView txtData = (TextView)mainActivityContext.findViewById(R.id.textView2);
txtData.setText(data);
}
});
}
}
MainActivity onCreate()
public class MainActivity extends Activity implements View.OnClickListener{
TextView txtData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Dummy text field that should populate with something upon
//onReceive() executing...
txtData = (TextView)findViewById(R.id.textView2);
txtData.setText("Ready.");
IntentFilter filter = new IntentFilter("action.getTestData");
filter.addDataScheme("string");
BroadcastReceiver c = new Receiver();
LocalBroadcastManager.getInstance(this).registerReceiver(c,filter);
}
我做错了什么导致收不到广播?我认为这与我的 IntentFilter
?
您可以尝试在 XML 的 <service>
块中设置 android:exported=true
。根据文档:
http://developer.android.com/guide/topics/manifest/service-element.html#exported
The default value depends on whether the service contains intent filters. The absence of any filters means that it can be invoked only by specifying its exact class name. This implies that the service is intended only for application-internal use (since others would not know the class name). So in this case, the default value is "false". On the other hand, the presence of at least one filter implies that the service is intended for external use, so the default value is "true".
希望对您有所帮助。
试试这个:
IntentFilter filter = new IntentFilter(cService.class);
filter.addCategory(Intent.CATEGORY_DEFAULT);
Receiver receiver = new Receiver();
registerReceiver(receiver, filter);
我通过将 BroadcastReceiver
合并到 MainActivity
的 onResume()
中,设法解决了我遇到的问题。我的目标是在 Service
完成检索所有网络数据后简单地捕获该数据。
我希望这对某人有所帮助...
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.Button;
public class MainActivity extends Activity implements View.OnClickListener {
private boolean isReceiverRegistered;
private Button btnRetrieveRouteData;
private BroadcastReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//UI Component Instances
btnRetrieveRouteData = (Button)findViewById(R.id.btnGetRouteInformation);
btnRetrieveRouteData.setOnClickListener(this);
}
@Override
protected void onResume(){
super.onResume();
if (!isReceiverRegistered) {
IntentFilter intentFilter = new IntentFilter("ma.MainActivity.WebServiceReceiver.ReturnedReceivedDataFilePath");
receiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, Intent intent) {
//Get message from WebServiceReceiver Intent
String ReceivedDataFromIntent = intent.getStringExtra("WebServiceReceiver_ReturnedReceivedDataFilePath");
//Do whatever with the data received from the Service...
}
};
//Register the receiver
isReceiverRegistered = true;
this.registerReceiver(receiver, intentFilter);
}
}
@Override
protected void onPause(){
super.onPause();
if (isReceiverRegistered) {
try {
unregisterReceiver(receiver);
} catch (IllegalArgumentException e) {
//Handle Exception as needed...
}
isReceiverRegistered = false;
}
}
@Override
public void onDestroy(){
super.onDestroy();
}
public void onClick(View view){
switch(view.getId()){
case R.id.btnGetRouteInformation:
CallWebService("testParam1", "testParam2");
break;
default:
//Do nothing
break;
}
}
private void CallWebService(String param1, String param2){
//Begin web call to retrieve necessary data.
ServerCaller.GetRequestForRouteWithDriverId(this, param1, param2);
//WebServiceReceiver will get this returned data and broadcast it; received in "onResume()" here.
}
}
然后我有另一个 classe 叫做 WebServiceReceiver
,这个 class 将处理来自网络服务的结果,它将准备数据然后创建我们的 onResume()
Override 方法将过滤并读入。
public class WebServiceReceiver extends BroadcastReceiver
{
public WebServiceReceiver() {}
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("Helper_GetRequestForData")){
//Retrieve the data from incoming Intent that web service submitted
final String ReceivedDataFilePathThatContainsData = intent.getStringExtra("Helper_GetRequestForData");
Intent responder = new Intent("ma.MainActivity.WebServiceReceiver.ReturnedReceivedDataFilePath");
responder.putExtra("WebServiceReceiver_ReturnedReceivedDataFilePath", ReceivedDataFilePathThatContainsData);
context.sendBroadcast(responder);
}
}
}
更换后一切开始为我工作
registerReceiver(receiver, filter);
和
LocalBroadcastManager.getInstance(this).registerReceiver(receiver, filter);
同上。当然,这仅适用于您使用应用程序内部的本地服务的情况。