如果我BroadcastReceiver通过mainfest文件声明一个系统广播(例如ACTION_POWER_DISCONNECTED),系统将在每次发送特定广播时调用它,因此BroadcastReceiver的生命周期不受限制.
但也有广播无法通过清单文件注册.对于这些广播,我们必须context.registerReceiver与相应的电话进行通话IntentFilter.假设我为它创建一个BroadcastReceiver BOOT_COMPLETED并context.registerReceiver从中调用,并且从不调用unregisterReceiver此接收器是否也永远存在(直到手机重新启动)?
针对Android O的应用无法再在其清单中为隐式广播注册广播接收器.隐式广播是一种不专门针对该应用的广播.
如果我的猜想是正确的,这将是一个简单的系统更改解决方法(当然你不应该这样做,但它是可能的).那么BroadcastReceiver在BOOT_COMPLETED广播具有相同的生命周期(保持到下一次重启)之后注册的是作为通过清单自动注册的BroadcastReceiver吗?
android android-intent android-broadcastreceiver android-8.0-oreo
我遇到了RxJava,Retrofit和Multi-Window模式的问题......我在Activity中调用了我们自己的api和Retrofit(实际的代码比这复杂一点):
api.getEvent(...)
.subscribeOn(Schedulers.io())
.observeOn(AndroidScheduler.mainThread())
.subscribe(event -> setupUI(event),
throwable -> showSnackbar(throwable));
Run Code Online (Sandbox Code Playgroud)
当应用程序处于"正常"模式(全屏)时,一切运行正常...我可以将应用程序放入bg,将其放回前台并再次调用api调用方法(它位于onResume方法中 - kind并且UI被绘制没有问题.当我激活多窗口模式时,调用onResume,成功调用api方法,但永远不会到达subscribe()方法.这种情况的堆栈跟踪是:
Retrofit: java.io.InterruptedIOException: thread interrupted
at okio.Timeout.throwIfReached(Timeout.java:145)
at okio.Okio$1.write(Okio.java:77)
at okio.RealBufferedSink.flush(RealBufferedSink.java:221)
at com.squareup.okhttp.internal.framed.Http2$Writer.flush(Http2.java:381)
at com.squareup.okhttp.internal.framed.FramedConnection.newStream(FramedConnection.java:283)
at com.squareup.okhttp.internal.framed.FramedConnection.newStream(FramedConnection.java:249)
at com.squareup.okhttp.internal.http.Http2xStream.writeRequestHeaders(Http2xStream.java:135)
at com.squareup.okhttp.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:710)
at com.facebook.stetho.okhttp.StethoInterceptor.intercept(StethoInterceptor.java:67)
at com.squareup.okhttp.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:695)
at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:576)
at com.squareup.okhttp.Call.getResponse(Call.java:287)
at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:243)
at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:205) at com.squareup.okhttp.Call.execute(Call.java:80)
at com.newrelic.agent.android.instrumentation.okhttp2.CallExtension.execute(CallExtension.java:43)
at retrofit.client.OkClient.execute(OkClient.java:53)
at com.newrelic.agent.android.instrumentation.retrofit.ClientExtension.execute(ClientExtension.java:42)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:326)
at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220)
at retrofit.RestAdapter$RestHandler$1.invoke(RestAdapter.java:265)
at retrofit.RxSupport$2.run(RxSupport.java:55)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at retrofit.Platform$Android$2$1.run(Platform.java:142)
at java.lang.Thread.run(Thread.java:761)
Run Code Online (Sandbox Code Playgroud)
应用程序不会崩溃但UI仍处于"占位符"状态,加载ProgressBar将永远消失.
编辑:我在其他活动中有相同的代码结构.但问题并没有出现在其他地方.
我已经运行gradlew命令来获取gradle依赖树.
gradlew.bat应用程序:依赖项
在输出时,我得到每个依赖项附加的不同类型的符号:
com.twotoasters.servos:util-otto:1.0.0
com.squareup.okhttp:okhttp:2.4.0 (*)
com.android.support:recyclerview-v7:23.2.0 -> 25.0.0
Run Code Online (Sandbox Code Playgroud)
有些依赖项没有任何符号,有些依赖于(*)和->.
这些符号是什么意思?
我试图搜索这个,但没有找到任何帮助.
我有一个BottomNavigationView我像这样实例化的:
BottomNavigationView navigationView = findViewById(R.id.bottom_navigation);
navigationView.setOnNavigationItemSelectedListener(this);
Run Code Online (Sandbox Code Playgroud)
/menu/menu.xml 看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/first_id"
android:icon="@drawable/home_icon"
android:title="Item" />
<item
android:id="@+id/second_id"
android:icon="@drawable/home_icon"
android:title="Item" />
<item
android:id="@+id/third_id"
android:icon="@drawable/home_icon"
android:title="Item" />
<item
android:id="@+id/fourth_id"
android:icon="@drawable/home_icon"
android:title="Item" />
</menu>
Run Code Online (Sandbox Code Playgroud)
/drawable/home_icon 看起来像这样:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFF0"
android:pathData="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"
android:strokeColor="#FFFFF0"
android:strokeWidth="1" />
</vector>
Run Code Online (Sandbox Code Playgroud)
如您所见,导航项的按钮周围有边框,但是,边框相互接触。因此我想在菜单按钮之间添加一个边距。我怎样才能做到这一点?
从屏幕截图中也可以看出,我正在阻止切换模式。我通过调用来做到这一点
BottomNavigationViewHelper.removeShiftMode(navigationView);
Run Code Online (Sandbox Code Playgroud)
使用这里的代码。
按钮周围的边框已添加如下:
int stateListDrawable = drawableStateLists.get(currentFragment);
navigationView.setItemBackgroundResource(stateListDrawable);
Run Code Online (Sandbox Code Playgroud)
whilestateListDrawable指的是StateListDrawable当按下不同的菜单按钮时会发生变化的 a。的StateListDrawable指向XML选择这又是指一个xml形状像这样,例如:
<?xml version="1.0" encoding="utf-8"?> …Run Code Online (Sandbox Code Playgroud) java android android-layout android-view bottomnavigationview
Android Studio 3.2 Canary 8
com.squareup:otto:1.3.8
io.reactivex:rxjava:1.3.7
kotlin 1.2.31
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用otto EventBus将事件发送回我的活动.
但是,我正在使用RxJava执行一些后台工作,并且需要在第一个完成后发送事件.然而,在发布事件后.活动永远不会收到它.
此事件必须在主线程上执行此操作.RxJava位于IO线程上.我不确定最好的方法是什么:
这是我执行RxJava和EventBus帖子的交互器的代码
class Interactors(private val eventBus: Bus) {
fun transmitMessage(): Completable {
return insertTransmission()
.andThen(onTransmissionChanged()) /* Send event to the activity */
.andThen(requestTransmission())
}
private fun insertTransmission(): Completable {
return Completable.fromCallable {
Thread.sleep(4000)
System.out.println("insertTransmission doing some long operation")
}
}
private fun requestTransmission(): Completable {
return Completable.fromCallable {
Thread.sleep(2000)
System.out.println("requestTransmission doing some long operation")
}
}
/* Need to send this event back to the activity/fragment */
private …Run Code Online (Sandbox Code Playgroud) 假设这里已经说过,开发人员有责任保留组件实例以实现自己的范围逻辑(因为范围方法将为给定组件返回相同的实例).
通过活动生命周期保持此组件引用的干净方法是什么?
示例:您正在实施MVP模式,因此您需要在Activity中使用Presenter.此演示者可以执行网络操作来下载项目.当设备旋转时,您的Activity将被销毁并重新创建,但您希望保持网络运行并返回预旋转演示者.
在为Presenter提供自定义PerActivity范围的组件范围是解决方案,因此您必须通过此循环保持Component实例,以便在首次启动Activity时注入相同的Presenter实例.
我们怎么处理这个?我想到了一种组件缓存(如HashMap?),它可以由Application类中的Application Component提供.
我想videoView.isAttachedToWindow()在我的片段中使用调用来验证videoview是否已初始化正常并且可以调用.
但是这个调用需要api级别19(当前min是14).videoView.isAttachedToWindow()API级别14及以上的最佳替代方案是什么?
编辑:我的视频视频播放通过Android盒子的HDMI输入流式传输的视频.在某些具有OS 4.0.4的硬件中,视频有时会出现抖动.
java android android-layout android-view android-windowmanager
我试图通过使用对象动画师将视图缩放到布局大小.这是一个观点LinearLayout.视图确实拉伸,但直到两个方向(即X和Y)的屏幕尺寸.
这是代码.
我觉得问题是这个:
计算必须完成多少缩放的公式.
zoomTillX = screen_width/zoomView_width;
zoomTillY = screen_height/zoomView_height;
Run Code Online (Sandbox Code Playgroud)或者使用以错误方式完成的Animation属性代码.
请让我知道如何实现放大.
public class MainActivity extends AppCompatActivity {
TextView tv;
double screen_height;
LinearLayout zoomView;
double screen_width;
double zoomTillX;
double zoomTillY;
double zoomView_width;
double zoomView_height;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
zoomView = (LinearLayout) findViewById(R.id.zoomView);
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
screen_height = (double)dm.heightPixels;
screen_width = (double)dm.widthPixels;
zoomView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
zoomView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
zoomView_width = (double)zoomView.getMeasuredWidth();
zoomView_height = (double)zoomView.getMeasuredHeight();
} …Run Code Online (Sandbox Code Playgroud) 查看ViewModel文档,它说:
换句话说,这意味着如果ViewModel的所有者因配置更改(例如旋转)而被销毁,则不会销毁它.所有者的新实例将重新连接到现有的ViewModel.
如果引用它的活动被销毁,ViewModel如何不被破坏?一旦我们创建一个新活动,它是如何重新连接的?
java android android-viewmodel android-architecture-components
我正在使用Twitter句柄运行此代码我很确定不存在以便测试错误处理.回调中的断点永远不会被击中,无论是成功还是失败.
有关为什么会这样的指示?
就像一个注释,这个代码可以正常使用有效的Twitter句柄,但也不会调用回调.
final Callback<Tweet> actionCallback = new Callback<Tweet>() {
@Override
public void success(Result<Tweet> result) {
int x = 1;
x++; // This code is just so I can put a breakpoint here
}
@Override
public void failure(TwitterException exception) {
DialogManager.showOkDialog(context, R.string.twitter_feed_not_found);
}
};
final UserTimeline userTimeline = new UserTimeline.Builder().screenName(handleStr + "dfdfddfdfdfasdf") // Handle that doesn't exist
.includeReplies(false).includeRetweets(false).maxItemsPerRequest(5).build();
final TweetTimelineListAdapter adapter = new TweetTimelineListAdapter.Builder(context)
.setTimeline(userTimeline)
.setViewStyle(R.style.tw__TweetLightWithActionsStyle)
.setOnActionCallback(actionCallback)
.build();
listView.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud) android ×10
java ×7
android-view ×2
rx-java ×2
android-architecture-components ×1
build.gradle ×1
callback ×1
dagger ×1
dagger-2 ×1
event-bus ×1
gradle ×1
kotlin ×1
multi-window ×1
twitter ×1