标签: android-application-class

为什么要扩展Application类?

为什么要扩展Application课程?

它对我有什么用?

为什么要这么做?

我读过它可以用来声明全局变量,是全部还是其他任何应用程序?

android android-application-class

165
推荐指数
9
解决办法
11万
查看次数

Android 7.0和7.1 getApplication()ClassCastException

在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)

android android-7.0-nougat android-application-class

25
推荐指数
2
解决办法
1934
查看次数

Android架构组件ViewModel上下文

我正在研究谷歌的架构组件,以便将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

11
推荐指数
1
解决办法
7291
查看次数

如何从 /vendor/app 启动与 android-TREBLE 兼容的供应商 java 服务

在我的 Android-O 设备中,下面两个后台服务通过 AIDL 相互通信。

  1. 本机/C++ android 服务

    • 通过 init rc 启动
    • 与系统 linux-user 一起运行
    • 部署在 /system 分区,eg, /system/bin/nat二进制。
  2. 来自 apk 的 Java 服务

    • 通过在 AndroidManifest 中注册的 bootcomplete 接收器启动。
    • 服务类也在 AndroidManifest 和 export:enabled 中指定。
    • 运行系统系统 linux 用户,使用平台证书签名。
    • 部署在系统分区中。 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

8
推荐指数
0
解决办法
950
查看次数

Application类中的java.lang.VerifyError,用于一小部分用户

(这不是其他类似问题的重复,因为这只发生在一小部分用户身上,不能由我重新创建)

在我最新的发布版本中,我突然看到了班级中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中崩溃,我担心它可能会在未来的版本中出现,因为我认为我在这个版本中没有改变任何方式与堆栈跟踪相关.

我得到的这次崩溃的统计数据

crash android verifyerror android-application-class

7
推荐指数
1
解决办法
291
查看次数

如何在xamarin android中扩展应用程序类

我想扩展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

6
推荐指数
2
解决办法
4389
查看次数

java.lang.ClassCastException 当我尝试将 Application 从 Fragment 转换为 MyApplication 时(Android 6+)

我有一个扩展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

   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 …
Run Code Online (Sandbox Code Playgroud)

java android classcastexception android-application-class

5
推荐指数
0
解决办法
865
查看次数

Android App Bundle 检查缺少的拆分会导致“RuntimeException: Package manager has dead”

我按照本指南将检查集成到我的应用程序中,以防止在使用 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

5
推荐指数
0
解决办法
904
查看次数

应用程序和库模块的清单文件中的多个应用程序类

在库模块的清单中,我需要使用一个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)

android android-library android-application-class

5
推荐指数
1
解决办法
1913
查看次数

如何为我的 Espresso 活动测试提供自定义应用程序类?

我对 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

3
推荐指数
1
解决办法
1405
查看次数

从应用程序调用活动

我试图用数位来自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

2
推荐指数
1
解决办法
1396
查看次数

如何使用Dagger2将ApplicationContext注入非活动类?

我有几个我想注入的课程.例如,我有一个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进行静态引用并不是将它们提供给这些非活动类的好方法.

我想最重要的问题是,这种方法是否存在与内存管理相同的静态引用问题,并持续存在这些辅助类的生命周期?

android dagger-2 android-application-class

2
推荐指数
1
解决办法
1719
查看次数

如果收到广播,应用程序类 OnCreate 是否会被调用

我正在使用JobIntentService执行某些任务,在任务结束后我发送一个广播,我的活动之一也会监听该广播。

假设在 Android 操作系统关闭 Activity 以释放一些内存的情况下,如果从应用程序发送广播,JobIntentService是否OnCreate也会调用应用程序?

java service android android-broadcast android-application-class

1
推荐指数
1
解决办法
1419
查看次数