为什么要扩展Application课程?
它对我有什么用?
为什么要这么做?
我读过它可以用来声明全局变量,是全部还是其他任何应用程序?
在Developer Console中,我看到很多像这样的堆栈跟踪崩溃
java.lang.RuntimeException:
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2984)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3045)
at android.app.ActivityThread.-wrap14(ActivityThread.java:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1642)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6776)
at java.lang.reflect.Method.invoke(Native Method:0)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
Caused by: java.lang.ClassCastException:
at com.myapp.ui.BaseActivity.getApp(BaseActivity.java:193)
at com.myapp.ui.BaseActivity.onCreate(BaseActivity.java:275)
at com.myapp.ui.CastActivity.onCreate(CastActivity.java:39)
at com.myapp.ui.MainActivity.onCreate(MainActivity.java:268)
at android.app.Activity.performCreate(Activity.java:6955)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2927)
Run Code Online (Sandbox Code Playgroud)
BaseActivity的getApp方法是
public App getApp() {
return (App) getApplication();
}
Run Code Online (Sandbox Code Playgroud)
App类是
public class App extends MultiDexApplication { ...
Run Code Online (Sandbox Code Playgroud)
并且在manifest应用程序标记中包含对此类的引用
<application
android:name="com.myapp.App"
Run Code Online (Sandbox Code Playgroud)
98%的崩溃是针对Android 7.0,休息是7.1.没有其他Android版本受到影响.
编辑:我使用proguard所以它可以以某种方式相关但保持类
-keep class com.myapp.** { *;}
-keep interface com.myapp.** { *;}
Run Code Online (Sandbox Code Playgroud)
注意:它可能没有关系,但在相同的Android版本中,它看起来像App的onCreate方法有时不被调用.我观察它是因为在onCreate中创建的某些对象在从Service(由AlarmManager启动)或BroadcastReceiver访问时为null
有谁知道什么可以导致它,如何解决它或解决它?谢谢
编辑2:我最终得到了这样的东西:
public App getApp() …Run Code Online (Sandbox Code Playgroud) 我正在研究谷歌的架构组件,以便将ViewModel和LiveData实现到我的应用程序,官方文档说:
注意:由于ViewModel比特定活动和片段实例更长,因此它永远不应引用View或任何可能包含对活动上下文的引用的类.如果ViewModel需要Application上下文(例如,查找系统服务),它可以扩展AndroidViewModel类并具有在构造函数中接收Application的构造函数(因为Application类扩展了Context)
在那之后,我最终得到了这样的代码:
public class ViewModelTest extends AndroidViewModel {
public ViewModelTest(Application application) {
super(application);
}
public void test(){
Prefs.getCurrentCode(getApplication());
}
Run Code Online (Sandbox Code Playgroud)
我应该在活动中正常实例吗?
val viewModel2 = ViewModelProviders.of(this).get(ViewModelTest::class.java)
viewModel2.test()
Run Code Online (Sandbox Code Playgroud)
不是很糟糕吗?要在需要访问SharedPreferences或需要上下文的任何内容时使用此应用程序变量?如果是,我应该避免在ViewModel上使用它并仅在视图上使用它吗?特别是如果我想用一个需要上下文的值更新UI组件.我有点不知道如何解决这个问题,我愿意接受任何建议.
提前致谢
android viewmodel android-context android-application-class android-livedata
在我的 Android-O 设备中,下面两个后台服务通过 AIDL 相互通信。
本机/C++ android 服务
eg, /system/bin/nat二进制。来自 apk 的 Java 服务
eg /system/app/jav/jav.apk到目前为止没有问题。以上两个服务都注册了ServiceManager. 两个服务都可以通过 /dev/binder. 相互调用,都从 Android 启动开始并无限期地继续运行。
高音带来了麻烦:
按照 Treble 的要求,上面的两个都应该移动到 /vendor 分区,并有适当的 SEPolicies。,这样,java 和 c++ 服务都可以通过/dev/vndbinder.相互调用,即通过注册自己VendorServiceManager。
参考文档https://source.android.com/devices/architecture/hidl/binder-ipc我能够启动本地 c++ 服务,/vendor/bin/nat从中VenorServiceManager(/dev/vndbinder)成功注册。
现在我可以通过vndservice call com.yyy.zzz.Myservice 0
但是,无法启动部署为的 JAVA …
android android-service android-service-binding android-securityexception android-application-class
(这不是其他类似问题的重复,因为这只发生在一小部分用户身上,不能由我重新创建)
在我最新的发布版本中,我突然看到了班级中java.lang.VerifyError出现类似崩溃的巨大高峰Application.
这条线很简单:
Settings.init(this);
Run Code Online (Sandbox Code Playgroud)
Settings周围的便利包装类在哪里SharedPreferences.似乎在不到百分之一的用户中找不到该类.
我们无法在我的团队设备上重新创建崩溃,Google Play的发布前报告显示0错误.
这是完整的堆栈跟踪:
java.lang.VerifyError:
at com.my_package.MyApplication.onCreate (MyApplication.java:74)
at android.app.Instrumentation.callApplicationOnCreate (Instrumentation.java:1036)
at android.app.ActivityThread.handleBindApplication (ActivityThread.java:6321)
at android.app.ActivityThread.access$1800 (ActivityThread.java:222)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1861)
at android.os.Handler.dispatchMessage (Handler.java:102)
at android.os.Looper.loop (Looper.java:158)
at android.app.ActivityThread.main (ActivityThread.java:7229)
at java.lang.reflect.Method.invoke (Native Method)
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)
Settings.init:
public static void init(Context context) {
sPrefs = PreferenceManager.getDefaultSharedPreferences(context);
}
Run Code Online (Sandbox Code Playgroud)
我应该补充一点,这个问题在我的单个生产应用程序版本上发生了97%,我无法重新创建运行该版本或任何版本的崩溃,但似乎只有该版本受到影响,到目前为止所有版本都有没有这个崩溃.
但是,我仍然看到该应用版本在Google Play中崩溃,我担心它可能会在未来的版本中出现,因为我认为我在这个版本中没有改变任何方式与堆栈跟踪相关.
我想扩展Android应用程序,我想重写oncreate方法.但由于某种原因,它非常糟糕......只有当我删除[应用程序]我才能运行它但是根据这个链接我们必须添加[应用程序]
[Application]
public class MainApp : Application
{
public MainApp(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
{
}
public override void OnCreate()
{
base.OnCreate();
//app init ...
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以澄清一下在xamarin android中扩展应用程序类的正确方法是什么
更新
如果我不删除[应用程序],我正好得到以下错误
/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets:错误:执行任务GenerateJavaStubs时出错:应用程序不能同时具有[Application]属性和[assembly:Application]的类型]属性.(myapp.Droid)
如果我应用程序然后它编译但它会抛出运行时错误
[AndroidRuntime]关闭VM [AndroidRuntime] FATAL EXCEPTION:main [AndroidRuntime]进程:com.test.myapp,PID:6524 [AndroidRuntime] java.lang.RuntimeException:无法实例化应用程序com.test.myapp.MainApp:java. lang.ClassNotFoundException:在路径上找不到类"com.test.myapp.MainApp":DexPathList [[zip file"/data/app/com.test.myapp-1/base.apk"],nativeLibraryDirectories=[/ data/app/com.test.myapp-1/lib/arm,/ data/app/com.test.myapp-1/base.apk!/ lib/arababi-v7a,/ system/lib,/ vendor/lib] [AndroidRuntime]在android.app.LoadedApk.makeApplication(LoadedApk.java:802)[AndroidRuntime] android.app.ActivityThread.handleBindApplication(ActivityThread.java:5377)[AndroidRuntime] at android.app.ActivityThread.-wrap2( ActivityThread.java)[AndroidRuntime]在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1545)[AndroidRuntime]在Android.os上的android.os.Handler.dispatchMessage(Handler.java:102)[AndroidRuntime]. Looper.loop(Looper.java:154)[AndroidRunt ime]在android.app.ActivityThread.main(ActivityThread.java:6119)[AndroidRuntime] at java.lang.reflect.Method.invoke(Native Method)[AndroidRuntime] at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.运行(ZygoteInit.java:886)[AndroidRuntime] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)[AndroidRuntime]引起:java.lang.ClassNotFoundException:未找到类"com. test.myapp.MainApp"on path:DexPathList [[zip file"/data/app/com.test.myapp-1/base.apk"],nativeLibraryDirectories=[/data/app/com.test.myapp-1/ lib/arm,/ data/app/com.test.myapp-1/base.apk!/ lib/armaabi-v7a,/ system/lib,/ vendor/lib]] [AndroidRuntime] …
c# android-manifest xamarin.android xamarin android-application-class
我有一个扩展android.app.Fragment的片段。在某些情况下,在 onCreateView 内部,当我尝试将 Application 强制转换为我的 Application 实现时,我会遇到java.lang.ClassCastException。
public class SketchFragment extends android.app.Fragment{
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View inflate = inflater.inflate(R.layout.layout, container, false);
ButterKnife.bind(this,inflate);
MyApplication application = (MyApplication) getActivity().getApplicationContext();
//Previously, I tried to
//MyApplication application = (MyApplication) getActivity().getApplication()
}
}
Run Code Online (Sandbox Code Playgroud)
实际上,只有在Android 6 中,我才在 <5% 的所有用户中出现此错误(我的 Crashlytics 日志说)。我的 Crashlytics 日志如下:
致命异常:java.lang.ClassCastException:android.app.Application 无法转换为 com.example.app.MyApplication
Run Code Online (Sandbox Code Playgroud)at com.example.app.ui.activity.main.MyFragment.onCreateView(MyFragment.java:95) at android.app.Fragment.performCreateView(Fragment.java:2281) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:983) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1163) at android.app.BackStackRecord.run(BackStackRecord.java:793) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1552) at android.app.FragmentManagerImpl$1.run(FragmentManager.java:487) at …
我按照本指南将检查集成到我的应用程序中,以防止在使用 Android App Bundles(用于丢失资源)时在运行时崩溃。
我onCreate()在超级调用之前的方法中将以下代码添加到我的应用程序类中:
if (MissingSplitsManagerFactory.create(this).disableAppIfMissingRequiredSplits()) {
// Skip app initialization.
return
}
Run Code Online (Sandbox Code Playgroud)
这在我自己的测试设备上没有问题。但是,如果我将 Android App Bundle 上传到 Google Play,预发布报告中的某些设备会出现此异常:
FATAL EXCEPTION: main
Process: com.example, PID: 25603
java.lang.RuntimeException: Unable to create application com.example.App: java.lang.RuntimeException: Package manager has died
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4858)
at android.app.ActivityThread.access$1600(ActivityThread.java:163)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1423)
at android.os.Handler.dispatchMessage(Handler.java:102)com.example
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5585)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
Caused by: java.lang.RuntimeException: Package manager has died
at android.app.ApplicationPackageManager.getPackageInfo(ApplicationPackageManager.java:136)
at Cfa.a(SourceFile)
at com.example.App.onCreate(SourceFile:17)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1014)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4855)
... …Run Code Online (Sandbox Code Playgroud) android android-package-managers google-play android-application-class android-app-bundle
在库模块的清单中,我需要使用一个Application类。在 Android 中可以做到这一点吗?
显现:
<application
android:name="com.compnay.app.App"
android:allowBackup="true"
android:label="@string/app_name"
>
</application>
Run Code Online (Sandbox Code Playgroud)
模块库清单:
<application
android:name="com.example.mymodule.App"
android:allowBackup="true"
android:label="@string/app_name"
>
</application>
Run Code Online (Sandbox Code Playgroud)
我对 Espresso 很陌生,但我正在尝试测试一个相对简单的 Activity。我的 android 应用程序有自己的自定义 Application 类。我如何告诉 Espresso 使用此类的模拟(或自定义)版本?
这是我的应用程序的自定义版本。它创建了一些测试数据(为简洁起见在此处进行了编辑)。接下来,我还将覆盖一些方法。
public class MockMyApplication extends MyApplication {
@Override
public void onCreate() {
super.onCreate();
// create some location data for testing
DataRecord rec = new DataRecord(1);
rec.setName("TestLoc1");
rec.setDescription("an important customer");
MyData.add(rec);
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用它进行测试,如下所示:
@RunWith(AndroidJUnit4.class)
@LargeTest
public class LocEditActivityTest extends AndroidJUnitRunner {
@Rule
public ActivityTestRule<LocEditActivity> activityTestRule
= new ActivityTestRule<>(LocEditActivity.class);
@Override
public Application newApplication(ClassLoader cl, String className, Context context) throws IllegalAccessException, ClassNotFoundException, InstantiationException {
return super.newApplication(cl, MockMyApplication.class.getName(), context);
}
@Test
public void …Run Code Online (Sandbox Code Playgroud) android unit-testing android-espresso android-application-class
我试图用数位来自Twitter的.该AuthCallBack从活动中使用和最近时不会触发文件说,从使用AuthCallBack 应用类.
现在我让AuthCallBack正常工作并且onSuccess我需要从我的MainActivity调用一个方法.我如何从Application类实现它.请帮助.我已经给出了下面的代码.
public class MyApplication extends Application {
private AuthCallback authCallback;
@Override
public void onCreate() {
super.onCreate();
authCallback = new AuthCallback() {
@Override
public void success(DigitsSession session, String phoneNumber) {
//call myFunction() from MainActivity here
}
@Override
public void failure(DigitsException exception) {
}
};
}
public AuthCallback getAuthCallback(){
return authCallback;
}
}
Run Code Online (Sandbox Code Playgroud) android twitter-oauth twitter-digits android-application-class
我有几个我想注入的课程.例如,我有一个APIContentLoader类,用于从端点下载JSON,然后将其存储到数据库中.我想将我用于读/写数据库的DatabaseManager类注入到APIContentLoader中.为了将DatabaseManager注入此类,我首先需要对ApplicationContext的引用,对吗?
这就是我现在设置的方式:
public class APIContentLoader{
@Inject DatabaseManager dbm;
@Inject BaseApplication app;
public APIContentLoader(){
app.getAppComponent().inject(this);
// dbm now is ready for use
}
... // rest of class stuff
}
Run Code Online (Sandbox Code Playgroud)
我的BaseApplication类扩展了标准的Application类.以这种方式向这个类注入BaseApplication引用是不好的做法?我知道对ApplicationContext进行静态引用并不是将它们提供给这些非活动类的好方法.
我想最重要的问题是,这种方法是否存在与内存管理相同的静态引用问题,并持续存在这些辅助类的生命周期?
我正在使用JobIntentService执行某些任务,在任务结束后我发送一个广播,我的活动之一也会监听该广播。
假设在 Android 操作系统关闭 Activity 以释放一些内存的情况下,如果从应用程序发送广播,JobIntentService是否OnCreate也会调用应用程序?
java service android android-broadcast android-application-class
android ×12
java ×2
c# ×1
crash ×1
dagger-2 ×1
google-play ×1
service ×1
unit-testing ×1
verifyerror ×1
viewmodel ×1
xamarin ×1