如果Service在不同的进程中运行(通过:name清单内的 \xe2\x80\x9c \xe2\x80\x9d)并带有前台标志。当系统想要释放一些内存时..(想象一下繁重的用户界面,用户按主页并导航到其他繁重的应用程序)
它会仅杀死该应用程序的主进程以释放资源吗?(显然保持服务进程完好无损),然后just当用户导航回应用程序时重新启动主进程。
如果Service运行在同一个进程中,它会释放除前台服务之外的所有资源(例如活动)吗?或者在这种情况下整个进程(带有大量用户界面)将被视为前台,因此消耗大量内存并且对用户手机不利
聚苯乙烯
\n\n据我所知,对前台服务没有任何保证。\n http://developer.android.com/reference/android/app/Service.html
\n\n我了解立即杀死进程的android设计\n(这回答了第二个问题,但想确定)
\n\nhttp://android-developers.blogspot.com/2010/04/multitasking-android-way.html
\n我想在应用程序进入 onPause 时保存 textView 的值。所以我实现了onSaveInstanceState和onRestoreInstanceState。但如下面的 logcat 输出所示,onRestoreInstanceState 从未被调用。
我知道 onRestoreInstanceState 和 onSaveInstanceState 都不属于应用程序生命周期的一部分,那么为什么 onSaveInstanceState 会被调用,而 onRestoreInstanceState 不会被调用呢?以及如何调用onRestoreInstanceState?
代码:
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.w(TAG, LogAnd.i("onResume", ""));
btAdapter = BluetoothAdapter.getDefaultAdapter();
if (btAdapter == null) {
tvStatus.setText("[" + SysUtils.getDeviceName() + "] no Bluetooth installed.");
} else {
tvStatus.setText("[" + SysUtils.getDeviceName() + "] Bluetooth installed.");
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
Log.w(TAG, LogAnd.i("onSaveInstanceState", ""));
outState.putString("statusText", tvStatus.getText().toString());
}
@Override …Run Code Online (Sandbox Code Playgroud) 我有两个变体的activity_main.xml(用于纵向/横向)。在此活动中,用户可以选择项目并浏览所选项目的详细信息。
在纵向方向上,片段动态添加到flFragmentContainer中,选择项目后,详细信息片段替换列表片段:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/flFragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"></FrameLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
在横向方向上,XML 文件中静态描述的片段:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<fragment
android:id="@+id/frgTaskList"
android:name="com.exprod.xchecklist.fragments.TaskListFragment"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
tools:layout="@layout/fragment_task_list" />
<fragment
android:id="@+id/frgTaskDetails"
android:name="com.exprod.xchecklist.fragments.TaskDetailsFragment"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
tools:layout="@layout/fragment_task_details">
</fragment>
</LinearLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
这是(MainActivity 的)onCreate() 方法的代码。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fragmentManager = getSupportFragmentManager();
TaskDetailsFragment taskDetailsFragment = (TaskDetailsFragment)fragmentManager.findFragmentById(R.id.frgTaskDetails);
isDynamicMode = taskDetailsFragment == null || !taskDetailsFragment.isInLayout();
if(isDynamicMode){
FragmentTransaction transaction = fragmentManager.beginTransaction();
Fragment …Run Code Online (Sandbox Code Playgroud) 如果您了解 Google 的实验性 Android 架构组件,您可能就知道MutableLiveData。为了让它使用起来更有趣,我带来了:
class KotlinLiveData<T>(val default: T) {\n val data = MutableLiveData<T>()\n\n operator fun getValue(thisRef: Any?, property: KProperty<*>):T {\n return data.value ?: default\n }\n\n operator fun setValue(thisRef: Any?, property: KProperty<*>, value:T) {\n if (Looper.myLooper() == Looper.getMainLooper()) {\n data.value = value\n } else {\n data.postValue(value)\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n然后我可以:
\n\nvar name : String by KotlinLiveData("not given")\nname = "Chrz\xc4\x99szczybrz\xc4\x99czykiewicz"\nRun Code Online (Sandbox Code Playgroud)\n\n但可惜 - 这使得data需要注册的内容Observer无法访问:
name.data.observe(this, nameObserver) // won\'t work :(\nRun Code Online (Sandbox Code Playgroud)\n\n知道我是否能以某种方式得到它吗? …
Firebase 崩溃报告捕获的异常:
异常 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.talmir.mickinet/com.talmir.mickinet.activities.HomeActivity}:android.content.res.Resources$NotFoundException:资源 ID 0x7f080058 android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2249) android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2299) android.app.ActivityThread.access$700 (ActivityThread.java:154) android.app.ActivityThread$H.handleMessage ...
由 android.content.res.Resources$NotFoundException 引起:资源 ID 0x7f080058 android.content.res.Resources.getValue (Resources.java:1883) android.support.v7.widget.AppCompatDrawableManager.c (SourceFile:332) android.support .v7.widget.AppCompatDrawableManager.a (SourceFile:197) android.support.v7.widget.AppCompatDrawableManager.getDrawable ...
HomeActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home); // line 238
FirebaseCrash.log("HomeActivity");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
if (!canAccessCamera() || !canAccessExternalStorage() || !canAccessContacts())
requestPermissions(INITIAL_PERMISSIONS, INITIAL_REQUEST);
copyRawFile(R.raw.file_receive);
// other codes...
Run Code Online (Sandbox Code Playgroud)
活动主页.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_home"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.talmir.mickinet.activities.HomeActivity"
android:background="@color/snow">
<fragment
android:id="@+id/frag_list"
class="com.talmir.mickinet.fragments.DeviceListFragment"
android:layout_width="match_parent"
android:layout_height="@dimen/phone_list_height">
</fragment>
<fragment
android:id="@+id/frag_detail" …Run Code Online (Sandbox Code Playgroud) java android android-lifecycle android-4.2-jelly-bean android-6.0-marshmallow
我想用LiveDatainFragment来观察一些数据的变化。现在我们假设:
Fragment A都有Fragment B自己的容器布局Activity,这意味着我们将FragmentTransaction#add()单独调用它们,并且由于没有任何操作,它们的onPause()或onResume()在添加(UI 更改)期间不会被调用FragmentTransaction#replace()。LiveData名为O的观察者,它会观察一些数据的变化,并据此更新UI。关键是:我们想要为变化播放一些动画,而不是TextView#setText()天真地调用属性设置器(如)。例如,动画可能是我们调用后播放的动画RecyclerView.Adapter#notifyItemInserted()添加B后,A就被视为对用户不可见。Fragment A然而,其生命周期或View通过调用getViewLifecycleOwner()仍然处于开启STARTED状态RESUMED。结果,O观察到数据变化后就会播放动画,但用户从一开始就看不到它。
我们该如何解决这个问题呢?任何想法或答案表示赞赏。提前致谢。
android android-lifecycle android-fragments fragment-lifecycle android-livedata
服务可以扩展LifecycleService哪个implements LifecycleOwner。如何让 FirebaseMessagingService 成为其中之一。即使它只是实现 LifecycleOwner,它会在重写的方法上返回什么getLifecycle()我需要它的背景是,通知启动了WorkManager通过观察谁的工作LiveData。
android android-lifecycle firebase-cloud-messaging android-architecture-components android-workmanager
我的文件有问题build.gradle,特别是 module 'android.x.lifecycle'。
我有以下错误
ERROR: Failed to resolve: androidx.lifecycle:lifecycle:2.2.0-beta01
This is the last version of androidx.lifecycle
Run Code Online (Sandbox Code Playgroud)
不知道是不是语法错误
这是build.gradle文件
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
defaultConfig {
applicationId "com.flixarts.ar.englishnow"
minSdkVersion 14
targetSdkVersion 29
buildToolsVersion '25.0.2'
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
buildToolsVersion = '28.0.3'
}
dependencies {
implementation 'androidx.lifecycle:lifecycle:2.2.0-beta01'
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'com.google.android.material:material:1.1.0-beta01'
implementation fileTree(dir: 'libs', …Run Code Online (Sandbox Code Playgroud) 这是我的设置 1. Main Activity - Contains MainFragment Mainfragment - Has MainFragViewModel
重现 - 1. 在开发者设置中打开不保留活动。2. 启动应用程序。3. 按主页。
现在,由于我们的设置,当应用程序进入后台时会发生以下活动。1. 片段视图模型 - onCleared() [意外,因为系统正在杀死片段,并且应用程序进程没有被杀死。] 2. 片段被破坏 [预期] 3. 主活动被破坏 - isFinishing = false(这意味着框架知道谁正在杀死)[预期] 4.应用程序没有被破坏[预期]
现在从后台应用程序卡再次启动应用程序。接下来发生了。1. 主要活动 - onCreate(bundle != null) [预期。还送了捆绑包!一切顺利] 2. 片段已创建 [预期 - 捆绑包已交付。即不为空] 3. FragmentViewModel 实例已创建 [意外!!因为视图模型应该存活下来。因为我们没有弹出片段。由于dev设置被系统杀掉了]
这种行为破坏了我的设计,并且为了使我的应用程序在开发人员手机上正常工作,他们可能会不保持活动。我必须将信息保存在捆绑包中!
我缺少什么?您可能的解决方案是什么?
我想做一些异步操作,仅当应用程序的状态为 InActive 或 Paused 时才涉及写入本地数据库,但是如果异步操作在运行时突然关闭应用程序怎么办
该操作在完成任务之前是否仍然有效?
android ×8
android-architecture-components ×1
androidx ×1
async-await ×1
build.gradle ×1
bundle ×1
delegates ×1
flutter ×1
future ×1
java ×1
kotlin ×1
mvvm ×1
viewmodel ×1