我遇到了ViewPager的问题,我的ListView正在丢失它的滚动位置.
可以使用以下命令轻松存储和恢复ListView的状态:
@Override
public View onCreateView (LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View v = inflater.inflate(R.layout.frag_cool_things, container, false);
AdvListView listView = (AdvListView) v.findViewById(R.id.lv0);
listView.setOnItemClickListener( mOnListItemClicked );
if (null != savedInstanceState)
{
listView.onRestoreListViewInstanceState(savedInstanceState.getParcelable("list_state"));
}
mListView = listView;
return v;
}
@Override
public void onSaveInstanceState (Bundle outState)
{
super.onSaveInstanceState(outState);
outState.putParcelable("list_state", mListView.onSaveListViewInstanceState());
}
Run Code Online (Sandbox Code Playgroud)
然而问题是,当正在刷片段时会被onDestroyView()调用但从不调用onSaveInstanceState (Bundle outState).
旋转屏幕,这样恢复ListView状态就好了,但刷卡我无法弄清楚如何正确恢复列表.
我正在观看Intent.FLAG_ACTIVITY_CLEAR_TOP的行为.
例如,我有三个活动A,B和C现在Flow是A - > B - > C.
现在当我从C开始使用此标志时使用以下代码.
Intent intent_to_a=new Intent(C.this,A.class);
intent_to_home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent_to_a);
Run Code Online (Sandbox Code Playgroud)
AFAIK,Intent.FLAG_ACTIVITY_CLEAR_TOP应该删除B并且应该恢复A.它也会以相同但奇怪的方式执行.它删除B,而不是删除A而不是创建A.还调用A的方法onDestroy.任何人都可以告诉我它是否合适?如果我不想让它破坏我该怎么办?
当我的Android设备上的电池死在活动和片段类(如果有的话)用什么方法在设备的"关闭"阶段被称为?
此外,如果用户当前正在查看我的应用程序中的屏幕,并且他们按住电源按钮并选择关闭,那么当电池电量耗尽并自动关闭时,调用/未调用的事件是否一致?
在onPause?
调用OnStop?
的OnDestroy?
OnDetach?
额外奖励:我是否有足够的时间将少量数据保存到Web服务器?
为了澄清当设备的电池"完全"死亡时"死亡",不再接受输入,屏幕上会弹出一个消息框/加载屏幕,显示"电源关闭".设备关闭后不久就会出现.
我只是需要足够的时间来保存手机关机之前的状态,我有一个策略来清理保存的数据,如果手机没有关闭,但我想尽可能接近手机关闭(任何超过一分钟真是无意义).
java android activity-lifecycle android-lifecycle android-activity
我正在尝试仅在棒棒糖上使用新的API进行活动转换(我使用的是紧凑版本),所以我在活动A中实现了从活动A到活动B的动画:
getWindow().setReenterTransition(null);
getWindow().setExitTransition(null);
getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setAllowReturnTransitionOverlap(false);
Run Code Online (Sandbox Code Playgroud)
因为我对进入或退出此活动不感兴趣,所以我想看到的唯一动画是在活动B的共享视图中.
对于启动活动B:
ActivityCompat.startActivity(this, intent, ActivityOptionsCompat.makeSceneTransitionAnimation(this, fabButton, getString(R.string.transition_fab)).toBundle());
Run Code Online (Sandbox Code Playgroud)
并设置活动B:
getWindow().setEnterTransition(new EmptyTransition());
getWindow().setReturnTransition(null);
getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setAllowReturnTransitionOverlap(false);
getWindow().getEnterTransition().addListener(listener).
Run Code Online (Sandbox Code Playgroud)
同样,我对返回转换的输入转换不感兴趣,因为内容被隐藏,直到调用了输入转换监听器方法'onTransitionEnd',因此我的转换全部基于从活动A移动/增长到活动B的共享元素当这个过渡完成后,我将把内容带入.
一切正常,但不是非常强大的设备(所以所有非Nexus)不时活动A默默崩溃:
java.lang.RuntimeException: Performing stop of activity that is not resumed: {com.transferwise.android.debug/com.transferwise.android.activity.LoggedInMainActivity}
Run Code Online (Sandbox Code Playgroud)
然后发生共享元素的转换,但是不调用侦听器(不是事件TransitionStart),因此内容不会进入.该应用程序没有崩溃,用户仍然可以按下并"再试一次",但它不是一个非常好的用户体验.
很难对它进行测试,因为它每10/20次发生一次,并且仅在某些特定设备上发生(它在Sony Xperia Z3紧凑型上发生的更多).
也:
Danieles-MacBook-Pro-2:~ danielebottillo$ adb shell dumpsys activity p | grep com.package.main.debug
*APP* UID 10349 ProcessRecord{3b27508d 18371:com.package.main.debug/u0a349}
dir=/data/app/com.package.main.debug-1/base.apk publicDir=/data/app/com.package.main.debug-1/base.apk data=/data/data/com.package.main.debug
packageList={com.package.main.debug}
- ActivityRecord{2f07bdf8 u0 com.package.main.debug/com.package.main.activity.ActivityA t1196}
- ActivityRecord{1e871eb3 u0 com.package.main.debug/com.package.main.activity.ActivityB t1196}
- 28ea3e28/com.android.providers.settings/.SettingsProvider->18371:com.package.main.debug/u0a349 s1/1 u0/0 +27m9s645ms
- ReceiverList{40f2178 18371 com.package.main.debug/10349/u0 remote:39e102db}
- ReceiverList{2e7456a6 18371 com.package.main.debug/10349/u0 remote:dde3801} …Run Code Online (Sandbox Code Playgroud) animation android android-lifecycle android-activity android-5.0-lollipop
这是我Service从一个按钮点击调用Activity.如果我Activity在Service运行时向左滑动它会崩溃.我也尝试通过放入android:process=":remote"清单在单独的过程中运行它,但它仍然是相同的.
@Override
public void onCreate(){
super.onCreate();
Log.d("Service", "Creating");
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return null;
}
@Override
public int onStartCommand (Intent intent, int flags, int startId)
{
super.onStartCommand(intent, flags, startId);
Log.d("Started", "Service");
type = intent.getIntExtra("Type",-1);
mode = intent.getIntExtra("Mode",-1);
rank = intent.getIntExtra("Rank", -1);
latitude = intent.getDoubleExtra("Lat", -1.0);
longitude = intent.getDoubleExtra("Long", -1.0);
startTime = intent.getLongExtra("Start", 0);
endTime = intent.getLongExtra("End", 0);
Run Code Online (Sandbox Code Playgroud)
我得到的错误是: …
我正在努力解决与a有关的一系列令人费解的事件Fragment.我正在尝试向一个片段添加一个片段Activity,然后在片段内调用一个方法来更新一些文本.但是,我发现的是该方法在 onCreateView()完成之前在片段中处理,这使我留下了一个空View对象,并且我的方法失败了.这是Activity代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_log_entry_details);
fragmentManager = getSupportFragmentManager();
titleBarFragment = new TitleBarVerticalFragment();
fragmentTransaction = fragmentManager.beginTransaction ();
fragmentTransaction.add(R.id.log_entry_title_frame, titleBarFragment);
fragmentTransaction.commit();
titleBarFragment.updateTitleBar("Edit Log Entry", 20, false);
}
Run Code Online (Sandbox Code Playgroud)
看起来很简单.这是TitleBarVerticalFragment类:
public class TitleBarVerticalFragment extends TitleBarFragment {
@Inject SharedVisualElements sharedVisualElements;
View view;
TextView titleLabel;
public TitleBarVerticalFragment() {
// add this line for any class that want to use any of the singleton objects
Injector.INSTANCE.getAppComponent().inject(this);
}
@Override
public View …Run Code Online (Sandbox Code Playgroud) 当试图从ViewModel返回的片段中观察实时数据时,我得到了以下异常,在此之前我在这篇文章中详细阐述了错误,交换
android.arch.lifecycle:common-java8:1.0.0-beta2了android.arch.lifecycle:compiler:1.0.0-beta2解决该问题,但现在我得到了以下异常
你可以在这里找到整个代码
E/AndroidRuntime: FATAL EXCEPTION: pool-1-thread-1
Process: com.nrs.nsnik.architecturecomponents, PID: 4114
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/arch/core/executor/AppToolkitTaskExecutor;
at android.arch.persistence.room.InvalidationTracker.addObserver(InvalidationTracker.java:241)
at android.arch.persistence.room.InvalidationTracker.addWeakObserver(InvalidationTracker.java:257)
at com.nrs.nsnik.architecturecomponents.data.NoteDao_Impl$4.compute(NoteDao_Impl.java:146)
at com.nrs.nsnik.architecturecomponents.data.NoteDao_Impl$4.compute(NoteDao_Impl.java:134)
at android.arch.lifecycle.ComputableLiveData$2.run(ComputableLiveData.java:87)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.arch.core.executor.AppToolkitTaskExecutor" on path: DexPathList[[zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/base.apk", zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/split_lib_dependencies_apk.apk", zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/split_lib_slice_0_apk.apk", zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/split_lib_slice_1_apk.apk", zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/split_lib_slice_2_apk.apk", zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/split_lib_slice_3_apk.apk", zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/split_lib_slice_4_apk.apk", zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/split_lib_slice_5_apk.apk", zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/split_lib_slice_6_apk.apk", zip file "/data/app/com.nrs.nsnik.architecturecomponents-1/split_lib_slice_7_apk.apk", zip file …Run Code Online (Sandbox Code Playgroud) android android-lifecycle android-livedata android-architecture-components
MVVM架构,
这是我的观点(活动):
private MyApp app;
private MainActivityVM viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = (MyApp) this.getApplication();
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
MainActivityVM.Factory factory = new MainActivityVM.Factory(app);
final MainActivityVM model = ViewModelProviders.of(this, factory)
.get(MainActivityVM.class);
viewModel = model;
binding.setVm(viewModel);
viewModel.onCreate();
Run Code Online (Sandbox Code Playgroud)
和视图模型:
public class MainActivityVM extends AndroidViewModel implements ViewModel {
public MainActivityVM(@NonNull Application application) {
super(application);
}
@Override public void onCreate() {
model = new MyService();
model.getData(); /* <-- how do i pass the activity here? */
}
@Override public …Run Code Online (Sandbox Code Playgroud) 我一直面临着这种奇怪的崩溃,当将架构组件添加到片段时,崩溃随机发生我无法通过直接场景重现它我有一个navigation bottom bar控制5个片段,其中一个片段有一个实现LifecycleObserver
崩溃日志的演示者:
Fatal Exception: java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1
at java.util.ArrayList.remove(ArrayList.java:405)
at android.arch.lifecycle.LifecycleRegistry.popParentState(LifecycleRegistry.java:194)
at android.arch.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:293)
at android.arch.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:332)
at android.arch.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:137)
at android.arch.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:123)
at android.support.v4.app.Fragment.performStart(Fragment.java:2380)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1467)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1759)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1827)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2596)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2383)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2338)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2245)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:703)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7225)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Run Code Online (Sandbox Code Playgroud)
更换该片段后发生崩溃,代码跟踪到我的代码从这里开始
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out)
.replace(R.id.flMain, fragment, tabModel.getName())
.addToBackStack(BACK_STACK_ROOT_TAG)
.commitAllowingStateLoss();
Run Code Online (Sandbox Code Playgroud)
这里有什么可能的问题?
android android-lifecycle android-fragments android-architecture-components android-jetpack
我有一个非常无聊的问题.当我的应用程序转到后台时,有时会在LogCat显示时终止该进程:
INFO/ActivityManager(187): Low Memory: No more background processes.
INFO/ActivityManager(187): Process com.app.myapp (pid 20681) has died.
INFO/WindowManager(187): WIN DEATH: Window{40592708 com.app.myapp/app.myapp.dashboard.Dashboard paused=false}
ERROR/InputDispatcher(187): channel '408b1d40 app.myapp/app.myapp.menus.products.Promotions (server)' ~ Consumer closed input channel or an error occurred. events=0x8
ERROR/InputDispatcher(187): channel '408b1d40 app.myapp/app.myapp.menus.products.Promotions (server)' ~ Channel is unrecoverably broken and will be disposed!
INFO/WindowManager(187): WIN DEATH: Window{408b1d40 app.myapp/app.myapp.menus.products.Promotions paused=false}
INFO/ActivityManager(187): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10100000 cmp=app.myapp/.Main } from pid 187
INFO/ActivityManager(187): Start proc app.myapp for activity app.myapp/.menus.products.Promotions: pid=20721 uid=10062 gids={3003, 1015}
Run Code Online (Sandbox Code Playgroud)
当我尝试返回应用程序时,通过任务切换器(长按回家),它会尝试返回上次打开的活动...并崩溃. …