当我开始Camera意图时,我注意到在生命周期onActivityResult之前被调用.onResumefragment
我也注意到了onActivityResult之后onStart.
但这是奇怪的部分:我有变量fileUri =="一些图像路径".这个变量是
请参阅logCat
12-03 14:39:42.418: D/Fragment1(29220): onStart fileUri: file:///mnt/sdcard/OPS_IMAGES/IMG_20121203_143933.jpg
12-03 14:39:42.463: W/PhoneWindow(29220): Previously focused view reported id 2131034140 during save, but can't be found during restore.
12-03 14:39:42.463: D/Fragment1(29220): onActivityResult fileUri is NULL!!!
12-03 14:39:42.468: D/Fragment1(29220): onResume fileUri: file:///mnt/sdcard/OPS_IMAGES/IMG_20121203_143933.jpg
Run Code Online (Sandbox Code Playgroud)
最糟糕的是,这只发生在50%的时间.另外50%的onActivityResult可以毫无问题地访问fileUri值...
我该怎么调试呢?
注意:为简单起见,我没有包含onResume,onStart,onActivityResult方法的代码.它们只是具有变量检查和日志调用的基本方法.如果需要,我将编辑问题并添加这些方法.
注意2:我使用谷歌支持库来支持较旧的API版本上的片段.
目前我正在与我合作,Android我仍然有一些理解Activity生命周期的麻烦.
让我用一个例子告诉你我的问题:
我的应用程序包含一个Navigation Drawer允许用于在不同Fragments 之间切换的应用程序.一个片段(片段A)是包含一些项目的列表.单击一个项目将打开活动B,可以将其描述为项目的详细视图.B通过Intent接收所有必要的信息,项模型实现Parcelable,并将其作为Extra添加到Intent.甲button活动B的打开地图视图活动C.
A - (项目) - > B - > C.
当B Activity onCreate方法调用时,使用C操作栏中的向上按钮会使应用程序崩溃
Item item = bundle.getParcelable("com.example.myapp.model.Item");
Run Code Online (Sandbox Code Playgroud)
当然,因为详细视图B获得了必须从A显示的所有必要信息.我该如何解决这个问题?我希望能够以某种方式存储该项目,同时调用C并再次上升到B. (使用C上的后退按钮工作正常)
在我的活动中,我经常使用这个成语:
@Override
public void onDestroy() {
super.onDestroy();
if (isFinishing() != true) return;
// do some final cleanup since we're going away for good
}
Run Code Online (Sandbox Code Playgroud)
片段有一个onDestroy()方法,但相当于isFinishing()什么?我应该getActivity().isFinishing()从片段中检查一下onDestroy()吗?
编辑添加:
以下是我在各种情况下得到的回调(按顺序),以及getActivity()返回null或非null,如果非null,则返回值getActivity().isFinishing():
场景#1: DialogFragment正在显示并且用户点击后退按钮(即需要释放引用):
onDismiss(): activity = non-null, finishing = false
onDestroy(): activity = non-null, finishing = false
Run Code Online (Sandbox Code Playgroud)
场景#2: DialogFragment正在显示并且父活动完成(即需要发布引用):
onDestroy(): activity = non-null, finishing = true
onDismiss(): activity = null, finishing = n/a
Run Code Online (Sandbox Code Playgroud)
场景#3: DialogFragment正在显示并且OS暂时销毁父活动(即不应该释放引用):
onDestroy(): activity = non-null, …Run Code Online (Sandbox Code Playgroud) android android-lifecycle android-fragments android-activity
我想有一个快速的方法来记录对活动调用的所有超级方法的所有调用.
我试过这个https://github.com/stephanenicolas/loglifecycle
但由于某种原因它不适用于AppCompatActivity......
我可以要求我的IDE覆盖所有方法; 但是如何将Log添加到所有这些?手动?一定有办法..
为什么在 Fragment 中实现Android 视图绑定时清除 in 很重要binding?onDestroyView
如文档所示,在片段中使用视图绑定,以及 Android 架构组件示例,binding在 中启动onCreateView,并在 中清除onDestroyView。
binding与在不清除的情况下启动相比,实施此操作有什么好处onDestroyView?如果没有显式清除实例变量binding,则应在 Fragment 销毁时将其清除。
private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = ResultProfileBinding.inflate(inflater, container, false)
val view = binding.root
return view …Run Code Online (Sandbox Code Playgroud) android android-layout android-lifecycle kotlin android-viewbinding
我正在调查一个奇怪的问题,我们将 更改androidx.appcompat:appcompat为1.3.1,1.4.1突然我们的LifecycleObservers观察过程生命周期停止发出任何事件。
我也在使用"androidx.lifecycle:lifecycle-extensions:2.2.0",我知道这已经被弃用,但如果 appcompat 是,它可以完美地工作1.3.1
我已在清单中设置了正确的应用程序名称,我已根据文档的要求包含此提供程序。
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
tools:node="remove" />
Run Code Online (Sandbox Code Playgroud)
初始化的示例,不起作用。该对象被注入到Application类中,并且生命周期观察器被添加,但从onStart未被onStop调用。
class AppLifecycle @Inject constructor(
private val foregroundProxy: AppLifecycleProxy
) : LifecycleObserver {
init {
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart() {
foregroundProxy.onStarted()
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStop() {
foregroundProxy.onStopped()
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:根据 @EpicPandaForce 评论,将清单中的提供程序块更改为:
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities=\"${applicationId}.androidx-startup"
android:exported="false"
tools:node=\"merge">
<!-- If you are using androidx.startup to initialize other components -->
<meta-data
android:name="androidx.lifecycle.ProcessLifecycleInitializer"
android:value="androidx.startup" …Run Code Online (Sandbox Code Playgroud) android android-appcompat application-lifecycle android-lifecycle
我还在弄清楚RxJava并使用它来与Retrofit 2做一些网络工作.我们已经尝试了几天了,而且现在这些代码看起来更具可读性但却遇到了一个我似乎无法想象的问题周围.
我正在尝试执行登录(返回API令牌),然后使用此令牌获取同一链中的所有初始数据,以便链的输出是令牌+数据.要做到这一点,我用一个调用我的API服务
apiClient
.login()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(token -> getData(token))
.subscribe(new Subscrber<Bundle>() {...});
Run Code Online (Sandbox Code Playgroud)
这似乎很好,但我也想在启动和停止链条时显示进度条.所以我也添加了一个.doOnSubscribe()和一个.doOnUnsubscribe().但是我注意到在更改方向后,我试图隐藏进度条的片段始终为null.
所以我搜索并发现了RxLifecycle lib,看起来它会有所帮助,我现在.cache()并取消订阅事件链.但我不知道如何onCreate()在此之后再次订阅同一事件?我想我错过了一些非常基本的东西,并希望对此有任何帮助.
当我按下电源键时,屏幕关闭(完全黑暗),系统会破坏我的活动,然后重新创建它:
03-28 22:48:00.934: V/[BB](5809): [GameControl] onPause
03-28 22:48:01.444: V/[BB](5809): [GameControl] onDestroy
03-28 22:48:01.724: V/[BB](5809): [GameControl] onCreate
03-28 22:48:03.016: V/[BB](5809): [GameControl] onResume
03-28 22:48:03.016: V/[BB](5809): [GameControl] onPause
Run Code Online (Sandbox Code Playgroud)
这是因为我的活动具有固定方向(横向)并且锁定屏幕是纵向.
我通过设置固定的纵向方向测试了这个理论,但问题没有发生.我还检查了getResources().getConfiguration()值:
{ scale=1.0 imsi=724/31 loc=pt_BR touch=3 keys=2/1/1 nav=1/1 orien=2 layout=17 uiMode=17 seq=36}
{ scale=1.0 imsi=724/31 loc=pt_BR touch=3 keys=2/1/1 nav=1/1 orien=1 layout=17 uiMode=17 seq=37}
{ scale=1.0 imsi=724/31 loc=pt_BR touch=3 keys=2/1/1 nav=1/1 orien=2 layout=17 uiMode=17 seq=38}
Run Code Online (Sandbox Code Playgroud)
怎么可以避免呢?我不希望锁定屏幕破坏我的活动!
我有一个由单个组成的Android应用程序Activity.我怎样才能确保Activity在给定时间内只存在一个应用程序实例(== )?我遇到了一种情况,我通过多次点击应用程序图标成功打开了我的应用程序的多个实例(这不会一直重现).
我有一个广播接收器,它在Android Applcation类的onCreate()方法中注册但是如何取消注册
例
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
registerReceiver(broadcastReceiver, new IntentFilter("TIMEZONE_CHANGED"));
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我在应用程序onCreate()方法中注册了它,并且Application类中没有onDestroy()/ onStop()方法来取消注册broadcastReceiver.
如何实现它