从非活动类中获取上下文

Posted

技术标签:

【中文标题】从非活动类中获取上下文【英文标题】:Get Context from a non activity class 【发布时间】:2014-10-11 15:55:52 【问题描述】:

是否可以? 没有在activity类中做一个方法来获取activity?

也许用一个新的 Thread 或者启动一个新的不可见的 Activity 来显示 Toast 然后回到之前的 Activity。

我的想法是编写一个包含一些方法的包,以通过 Toast 或 Alert 显示消息。例如,我只需要导入包并可以显示 Toast。

编辑: 也许我应该说我将为我的应用程序使用这个包,它在后台使用服务,如果我关闭应用程序,应用程序在后台运行并在我调用 Toast 时崩溃。该错误是 Nullpointer 异常,仅当我关闭应用程序并且服务正在后台重新启动时,我才会从警报中获得该异常。

编辑: 代码: 这是来自服务的方法。 Services 是类名,如果我关闭服务再次启动的应用程序,它会自动启动。

@Override
public int onStartCommand(Intent intent, int flags, int startId) 
    mT(Services.this,"Service starting");
    A.mA(MyActivity.getAct(),"Title", "Message", R.drawable.ninja,
            new DialogInterface.OnClickListener() 
                public void onClick(DialogInterface dialog, int which) 
                    mT(Services.this, "Clicked");
                
            
            );
    Message msg = mServiceHandler.obtainMessage();
    msg.arg1 = startId;
    mServiceHandler.sendMessage(msg);

    // If we get killed, after returning from here, restart
    return START_STICKY;

Alert 和 Toast 将通过启动服务显示,但如果我关闭应用程序并且服务在后台重新启动,则不会。有趣的是,如果我删除警报而不是警报,则会显示 Toast。错误信息是:

08-19 18:37:30.479    4591-4591/productions.ingos.gpstracker E/androidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start service productions.ingos.gpstracker.Services@417322e8 with null: java.lang.NullPointerException
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2553)
        at android.app.ActivityThread.access$2000(ActivityThread.java:134)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4867)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
        at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:142)
        at android.app.AlertDialog$Builder.<init>(AlertDialog.java:359)
        at ingos.productions.DP.mA(DP.java:29)
        at productions.ingos.gpstracker.Services.onStartCommand(Services.java:117)
        at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2536)
        at android.app.ActivityThread.access$2000(ActivityThread.java:134)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4867)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
        at dalvik.system.NativeStart.main(Native Method)

Alert 和 Toast 的方法在 DP 类中:

 public static void mT(Context ct,String str)
    
        Toast.makeText(ct,str,Toast.LENGTH_SHORT).show();
    

 public static void mA(Context ct,String title, String message,Integer icon,DialogInterface.OnClickListener Dif)
    
        AlertDialog alertDialog = new AlertDialog.Builder(ct).create();
        alertDialog.setTitle(title);
        alertDialog.setMessage(message);
        alertDialog.setButton("OK", Dif);
        alertDialog.setIcon(icon);
        alertDialog.show();
    

【问题讨论】:

您可以像当前的 Toast 方法一样传入上下文。 makeText(上下文上下文、字符串值、int 持续时间)。您也可以在初始化时将其 Context 传递给您的类。 能否请您发布一些代码和您的日志猫消息 【参考方案1】:

您可以像当前的 Toast 方法一样传入上下文。 makeText(上下文上下文、字符串值、int 持续时间)。您还可以在初始化时将其 Context 传递给您的类。

Toast 使用公共静态方法,如果你走那条路

【讨论】:

【参考方案2】:

如果您的类是片段,那么简单的 getActivity() 方法将为您提供上下文,如果是简单的 java 类,那么您需要在该类中创建带有 Context 参数的构造函数,该参数可以从初始化它的 Activity 获取上下文。

【讨论】:

以上是关于从非活动类中获取上下文的主要内容,如果未能解决你的问题,请参考以下文章

从非活动单例类中获取应用程序上下文

斯威夫特,演员:演员隔离属性“扫描”不能从非隔离上下文中变异

获取服务中前台活动的上下文

在分离的片段中获取上下文/活动?

在android中获取上下文和活动对象null

Excel VBA,从非活动工作表中获取范围