MainActivity 中的 BroadcastReceiver 不接收 Broadcast Intents
BroadcastReceiver in MainActivity does not receive Broadcast Intents
我在 Android 编程方面还很陌生,所以我可能会犯非常愚蠢的错误。我正在编写一个简单的应用程序来收集 activity 数据。我有一个 MainActivity
和一个 ActivityRecognizedService
来查询 Google 的 Activity 识别 API。我正在尝试接收从 ActivityRecognizedService
到 MainActivity
的已识别 activity,这样我以后可以定期将记录与我将收集的其他数据一起写入文件。问题是,我将用来在文件上写入数据的线程没有接收到广播消息。这是项目的MWE。
在:ActivityRecognizedService.java
public class ActivityRecognizedService extends IntentService {
public static final String LOCAL_BROADCAST_NAME = new String("API.ACTIVITY.BROADCAST_NAME");
public ActivityRecognizedService() {
super("ActivityRecognizedService");
}
public ActivityRecognizedService(String name) {
super(name);
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
if (ActivityRecognitionResult.hasResult(intent)) {
ActivityRecognitionResult activityRecognitionResult = ActivityRecognitionResult.extractResult(intent);
Log.e("API.ACTIVITY.DETECTION", "Activity detected: " + activityRecognitionResult.getMostProbableActivity().toString());
/* This DOES log the activity when detected */
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}
}
在MainActivity.java
public class MainActivity
extends AppCompatActivity
implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
private ActivityRecognitionResult activityRecognitionResult;
private GoogleApiClient googleApiClient;
private BroadcastReceiver broadcastReceiver;
@Override
protected void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
setContentView(R.layout.activity_main);
/* check permissions, Google Play Services availabililty ... */
googleApiClient = new GoogleApiClient.Builder(this);
.addApi(ActivityRecognition.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("API.ACTIVITY.RECEIVE", ActivityRecognitionResult.extractResult(intent).toString());
/* This DOES NOT log the activity result */
}
}
googleApiClient.connect();
// This is the thread I will use to write records on file, to do
new Thread((Runnable) -> {
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, new IntentFilter(ActivityRecognizedService.LOCAL_BROADCAST_NAME));
while (true) {
SystemClock.sleep(250);
// do stuff..
}
}).start();
}
@Override
public void onConnected(@Nullable Bundle bundle) {
Intent intent = new Intent(this, ActivityRecognizedService.class);
PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
ActivityRecognitionClient activityRecognitionClient = ActivityRecognition.getClient(this);
Task task = activityRecognitionClient.requestActivityUpdates(250, pendingIntent);
}
}
当然,记录接收到的广播不是最终目标,因为我可以将其留在 onHandleIntent()
,相反,我需要将提取的结果与我将在最后收集的其他数据一起写入文件线。我还在 onResume()
方法中调用了 registerReceiver
。
我认为问题在于您广播了相同的传入 Intent
。广告没有附加任何操作。因此 BroadcastReceiver
您已注册操作 "API.ACTIVITY.BROADCAST_NAME" 将不会收到通知。
将操作设置为 Intent
。
@Override
protected void onHandleIntent(@Nullable Intent intent) {
Intent sendIntent=new Intent(LOCAL_BROADCAST_NAME);
LocalBroadcastManager.getInstance(this).sendBroadcast(sendIntent);
}
我在 Android 编程方面还很陌生,所以我可能会犯非常愚蠢的错误。我正在编写一个简单的应用程序来收集 activity 数据。我有一个 MainActivity
和一个 ActivityRecognizedService
来查询 Google 的 Activity 识别 API。我正在尝试接收从 ActivityRecognizedService
到 MainActivity
的已识别 activity,这样我以后可以定期将记录与我将收集的其他数据一起写入文件。问题是,我将用来在文件上写入数据的线程没有接收到广播消息。这是项目的MWE。
在:ActivityRecognizedService.java
public class ActivityRecognizedService extends IntentService {
public static final String LOCAL_BROADCAST_NAME = new String("API.ACTIVITY.BROADCAST_NAME");
public ActivityRecognizedService() {
super("ActivityRecognizedService");
}
public ActivityRecognizedService(String name) {
super(name);
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
if (ActivityRecognitionResult.hasResult(intent)) {
ActivityRecognitionResult activityRecognitionResult = ActivityRecognitionResult.extractResult(intent);
Log.e("API.ACTIVITY.DETECTION", "Activity detected: " + activityRecognitionResult.getMostProbableActivity().toString());
/* This DOES log the activity when detected */
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
}
}
在MainActivity.java
public class MainActivity
extends AppCompatActivity
implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
private ActivityRecognitionResult activityRecognitionResult;
private GoogleApiClient googleApiClient;
private BroadcastReceiver broadcastReceiver;
@Override
protected void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
setContentView(R.layout.activity_main);
/* check permissions, Google Play Services availabililty ... */
googleApiClient = new GoogleApiClient.Builder(this);
.addApi(ActivityRecognition.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("API.ACTIVITY.RECEIVE", ActivityRecognitionResult.extractResult(intent).toString());
/* This DOES NOT log the activity result */
}
}
googleApiClient.connect();
// This is the thread I will use to write records on file, to do
new Thread((Runnable) -> {
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, new IntentFilter(ActivityRecognizedService.LOCAL_BROADCAST_NAME));
while (true) {
SystemClock.sleep(250);
// do stuff..
}
}).start();
}
@Override
public void onConnected(@Nullable Bundle bundle) {
Intent intent = new Intent(this, ActivityRecognizedService.class);
PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
ActivityRecognitionClient activityRecognitionClient = ActivityRecognition.getClient(this);
Task task = activityRecognitionClient.requestActivityUpdates(250, pendingIntent);
}
}
当然,记录接收到的广播不是最终目标,因为我可以将其留在 onHandleIntent()
,相反,我需要将提取的结果与我将在最后收集的其他数据一起写入文件线。我还在 onResume()
方法中调用了 registerReceiver
。
我认为问题在于您广播了相同的传入 Intent
。广告没有附加任何操作。因此 BroadcastReceiver
您已注册操作 "API.ACTIVITY.BROADCAST_NAME" 将不会收到通知。
将操作设置为 Intent
。
@Override
protected void onHandleIntent(@Nullable Intent intent) {
Intent sendIntent=new Intent(LOCAL_BROADCAST_NAME);
LocalBroadcastManager.getInstance(this).sendBroadcast(sendIntent);
}