因此,我正在研究从一些长期运行的网络操作中将回调接口更改为本地广播的可行性.由于Activity生命周期为需要修改UI的异步请求创建了各种复杂功能(将Activity与回调断开连接onDestroy(),不要FragmentTransaction在之后修改s onSaveInstanceState()等),我认为使用本地广播更有意义,我们可以在生命周期事件中注册/取消注册接收器.
但是,当在配置更改期间销毁并重新创建活动时,没有注册广播接收器(onPause()/onResume()例如)之间的这个小窗口时间.因此,例如,如果我们在onCreate()if中启动异步请求savedInstanceState == null(例如,对于活动的第一次启动),如果用户在操作完成之前更改其设备方向,则完成时发送的广播是否可能丢失?(即接收器在onPause()上未注册,然后操作完成,然后接收器在onResume()中重新注册)
如果是这种情况,那么它会增加我们需要添加支持的额外复杂性,而且可能不值得切换.我已经研究了其他东西,比如Otto EventBus库,但我不确定它是否有同样的问题需要担心.
我想开发一个包含三个活动和两个服务的Android应用程序.
名为WebClientService的第一个Service 使用Handler每30秒调用一次REST API,并且必须通过结果通知活动的Activity.它还必须通知名为DatabaseService的第二个服务,以便更新本地数据库.
数据库服务将被称为只有一次的onCreate(在应用程序崩溃和重启的情况下)的,只是一次活动的onRestart(以这种方式,我们有数据显示的情况下,出现了连接问题).由于WebClientService每隔30秒通知"活动"活动,因此活动将自动更新.
问题是:
通知更新活动活动和后台DatabaseService的最佳方法是什么?我的想法是在WebClientService中使用sendBroadcast()并在每个活动和DatabaseService中使用BroadcastReceiver,这是正确的方法吗?
我应该使用相同的方法进行AllMeetingRoomActivity和DatabaseService之间的通信,还是应该使用绑定服务?
谢谢
更新:DatabaseService不再是后台服务,而只是WebClientService和活动之间的db层的共享实例.
现在的问题是:这是一个很好的方法,只需将我的30秒更新写入本地数据库,并允许活动每隔几秒钟更新一次,只需从本地数据库读取?这会对性能产生太大影响吗?
语境:
遵循我到目前为止所实现的,但使用SettableFutures,因此一旦我明确了如何使它们有效地进行通信,就需要使用服务和广播重新实现:
public class MainActivity extends AppCompatActivity {
private TextView meetingsTextView;
private EditText mEdit, editSubject;
private final ConnectorInitializer clientInitializer = new ConnectorInitializer();
private AppConnector genericClient; // can use OutlookClient or a test client to talk with a mock server
@Override
protected void onCreate(Bundle savedInstanceState) {
// initializes client based on …Run Code Online (Sandbox Code Playgroud) android android-service android-activity localbroadcastmanager
我在IntentService中运行后台任务.我在通知栏中显示进度(使用NotificationManager),如果有人点击该通知,则要取消该任务.
我用广播服务成功实现了它.但是,我在想是否有可能对localBroadcast做同样的事情.
如果我将"registerReceiver"更改为"LocalBroadcastManager.getInstance(this).registerReceiver",则代码不起作用.你能否告诉我为什么我不能使用localbroadcast和pendingintent?
谢谢,
目前我的代码是:
boolean isCancelled;
Context context;
NotificationManager mNotifyManager;
NotificationCompat.Builder mBuilder;
int mId = 2;
protected void onHandleIntent(Intent intent) {
isCancelled = false;
context = getApplicationContext();
IntentFilter filter = new IntentFilter();
filter.addAction("com.migrationdesk.mylibman.MyServiceClass.STOP");
registerReceiver(receiver, filter);
getNotification();
mainTask(); // THIS IS SOME BACKGROUND TASK
}
private final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals("com.migrationdesk.mylibman.MyServiceClass.STOP")){
isCancelled = true;
}
}
};
protected void getNotification() {
Intent newintent = new …Run Code Online (Sandbox Code Playgroud) android broadcast android-pendingintent localbroadcastmanager
我的 Android 应用程序崩溃了。其中显示了 targetSDKVersion 34 的安全异常。
怎么解决这个问题。错误如下所示(playcore库)com.google.android.play.core.listener.zzc.zzb(com.google.android.play:core@@1.10.3:3)
注意:我在我的应用程序中使用 LocalBroadcastManager。这个问题是因为这个才提出来的吗?
代码:
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, filter)
Run Code Online (Sandbox Code Playgroud)
错误:
Fatal Exception: java.lang.SecurityException
pck: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts
android.os.Parcel.createExceptionOrNull (Parcel.java:3057)
android.content.ContextWrapper.registerReceiver (ContextWrapper.java:755)
com.google.android.play.core.listener.zzc.zzb (com.google.android.play:core@@1.10.3:3)
com.google.android.play.core.listener.zzc.zzf (com.google.android.play:core@@1.10.3:4)
com.google.android.play.core.appupdate.zzf.registerListener (com.google.android.play:core@@1.10.3:1)
fragments.Summaryfragment.onCreate (Summaryfragment.java:144)
androidx.fragment.app.Fragment.performCreate (Fragment.java:2949)
androidx.appcompat.app.AppCompatActivity.onStart (AppCompatActivity.java:246)
ActionBarFragmentActivity.onStart (ActionBarFragmentActivity.java:358)
android.app.Instrumentation.callActivityOnStart (Instrumentation.java:1582)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:971)
Run Code Online (Sandbox Code Playgroud) 如果我能够像这样注册接收者:
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("myStringFilter"));
Run Code Online (Sandbox Code Playgroud)
并像这样发送广播:
Intent intent = new Intent("myStringFilter");
LocalBroadcastManager.getInstance(new Activity()).sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)
为什么甚至要求Context需要getInstance?如果我可以说new Activity()仍然有效,那有什么意义呢?
我正在使用LocalBroadcastManager使用APPLICATION CONTEXT向我的活动和服务进行广播,如下所示:
public class CommonForApp extends Application{
public void broadcastUpdateUICommand(String[] updateFlags,
String[] flagValues) {
Intent intent = new Intent(UPDATE_UI_BROADCAST);
for (int i = 0; i < updateFlags.length; i++) {
intent.putExtra(updateFlags[i], flagValues[i]);
}
mLocalBroadcastManager = LocalBroadcastManager.getInstance(mContext);
mLocalBroadcastManager.sendBroadcast(intent);
}}
Run Code Online (Sandbox Code Playgroud)
现在在我的服务中使用监听器,我正在调用broadcastUpdateUICommand(),如下所示:
public class mService extends Service {
public BuildNowPLaylistListListener buildCursorListener = new BuildNowPLaylistListListener() {
@Override
public void onServiceListReady() {
mApp.broadcastUpdateUICommand(
new String[] { CommonForApp.INIT_DRAWER},
new String[] {""});
}}}
Run Code Online (Sandbox Code Playgroud)
我正在我的活动中接收广播,如下所示:
public class mActivity extends Activity{
BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void …Run Code Online (Sandbox Code Playgroud) service android android-context android-activity localbroadcastmanager
在本教程中, 一个类派生自BroadcastReceiver.然后它接收消息.怎么样?这只是一个类的定义,而不是它的一个实例!
在我们弄清楚之后 - 我们如何防止这种情况发生,以便我们可以将此类与a一起使用LocalBroadcastManager,仅限于应用程序?(当然,与教程中的情况不同,因为这是一条不是来自应用程序的消息.)
android broadcastreceiver xamarin localbroadcastmanager xamarin.forms
我在主活动中使用 BroadcastReceiver 并在 OnCreate 中注册它并尝试在 Destroy 上取消注册它,但有时应用程序崩溃,因为它表明我正在尝试取消注册已取消注册的接收器。这是我的代码:
\n\n@Override\n public void onCreate(Bundle savedInstanceState) {\n ...\nLocalBroadcastManager.getInstance(this).registerReceiver(forceLogoutRequest, new IntentFilter(CommonUtils.FORCE_LOGOUT));\n}\n\n @Override\n public void onDestroy() {\n super.onDestroy();\nif(forceLogoutRequest!=null) {\n unregisterReceiver(forceLogoutRequest);\n forceLogoutRequest = null;\n }\n}\n\n\n private BroadcastReceiver forceLogoutRequest = new BroadcastReceiver() {\n @Override\n public void onReceive(Context context, Intent intent) {\n ..\n ..\n\n }\n };\nRun Code Online (Sandbox Code Playgroud)\n\n这就是我在控制台中得到的:
\n\n 10-12 13:28:34.644 5772-6344/? E/AndroidRuntime: FATAL EXCEPTION: main\n Process: com.myapp.nurse, PID: 5772\n java.lang.RuntimeException: Unable to destroy activity java.lang.IllegalArgumentException: Receiver not registered: com.myapp.hp.nurse.activity.MainActivity$5@1a174913\n at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3812)\n at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3830)\n at android.app.ActivityThread.access$1400(ActivityThread.java:156)\n at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)\n …Run Code Online (Sandbox Code Playgroud) 我在intentService中有一个本地广播,它向一个活动发送一条消息.问题是我得到一个空指针异常.任何帮助表示赞赏:)
LogCat错误
01-22 17:57:15.461: I/Arrival(16592): This is instantated
01-22 17:57:16.859: D/sender(16592): Broadcasting message
01-22 17:57:16.867: D/AndroidRuntime(16592): Shutting down VM
01-22 17:57:16.867: W/dalvikvm(16592): threadid=1: thread exiting with uncaught exception (group=0x4110d930)
01-22 17:57:16.875: E/AndroidRuntime(16592): FATAL EXCEPTION: main
01-22 17:57:16.875: E/AndroidRuntime(16592): java.lang.NullPointerException
01-22 17:57:16.875: E/AndroidRuntime(16592): at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:297)
01-22 17:57:16.875: E/AndroidRuntime(16592): at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46)
01-22 17:57:16.875: E/AndroidRuntime(16592): at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:116)
01-22 17:57:16.875: E/AndroidRuntime(16592): at android.os.Handler.dispatchMessage(Handler.java:99)
01-22 17:57:16.875: E/AndroidRuntime(16592): at android.os.Looper.loop(Looper.java:175)
01-22 17:57:16.875: E/AndroidRuntime(16592): at android.app.ActivityThread.main(ActivityThread.java:5279)
01-22 17:57:16.875: E/AndroidRuntime(16592): at java.lang.reflect.Method.invokeNative(Native Method)
01-22 17:57:16.875: E/AndroidRuntime(16592): at java.lang.reflect.Method.invoke(Method.java:511) …Run Code Online (Sandbox Code Playgroud) android broadcastreceiver android-broadcast localbroadcastmanager
我有一个在 Manifest 和MapboxMapActivity中定义的不同进程中的服务,我只是想知道如何使用LocalBroadcastManager.
我试图将服务上下文传递给LocalBroadcastManager.getInstance()然后LocalBroadcast在我的活动中注册一个。它注册成功,但无法从我的服务中获取信息!
这是我的代码,在我的服务中...
Intent locationIntent = new Intent("LocationIntent");
locationIntent.setAction("updatedLocations");
locationIntent.putExtra("list",updatedList);
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(locationIntent);
Run Code Online (Sandbox Code Playgroud)
...我在我的活动中注册它:
LocalBroadcastManager.getInstance(getApplicationContext()).registerReceive``r(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Timber.tag("localB").d("registered!");
if (intent != null && intent.getAction() != null &&
intent.getAction().equals("updatedLocations")) {
sawLocationsList = (HashMap<Integer,
MarkerItem>)intent.getSerializableExtra("list");
Timber.tag("sawL").d("updated");
}
}
} , new IntentFilter("LocationIntent"));
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序时,我的服务发送广播,但我的活动没有收到广播消息!
我认为这个问题是因为我的服务是在我的清单中的另一个进程中定义的......
android:name=".services.ForegroundService"
android:enabled="true"
android:exported="false"
android:process=":ForegroundService"
Run Code Online (Sandbox Code Playgroud)
...但我想以这种方式进行交流,因为处于不同的过程有助于我实现电池效率目标。
java android android-activity android-broadcast localbroadcastmanager
我刚刚通过Refactor -> Move to AndroidxAndroid Studio 中的选项迁移到了 androidx 。默认情况下,该build.gradle文件正在使用:
implementation 'androidx.appcompat:appcompat:1.0.0'
Run Code Online (Sandbox Code Playgroud)
我在项目的很多地方都使用了 LocalBroadcastManager。我可以完美地import androidx.localbroadcastmanager.content.LocalBroadcastManager与上面的 v1.0.0 一起使用androidx.appcompat。但是当我将其更新为 1.1.0 时:
implementation 'androidx.appcompat:appcompat:1.1.0'
Run Code Online (Sandbox Code Playgroud)
导入不起作用。我收到Unresolved reference : localbroadcastmanager错误。
我试图清理项目并多次重建项目,但问题仍然存在。
有什么解决办法吗?谢谢。