How to use getSystemService in a non-activity class?

后端 未结 5 1521
既然无缘
既然无缘 2020-12-25 09:48

I am building an application which triggers an alarm via AlarmManager.

I would like to be able to call the Alarm via it\'s own non-activity class, but since I am not

相关标签:
5条回答
  • 2020-12-25 10:07

    Service and Activity inherit from Context - so when you are calling getSystemService in these classes, you are really calling super.getSystemService.

    If you want to have a Context available in another class, you can pass one as an argument to a method of that class, keep a reference to it, etc.

    Edit: Code sample. But seriously, it is extremely basic - if you understand inheritance and methods.

    class MyActivity extends Activity { // Activity extends Context, so MyActivity also extends Context
      void someMethod() {
        MyOtherClass.useStaticContext(this);
        MyOtherClass instance = new MyOtherClass();
        instance.useInstanceContext(this.getApplicationContext());
      }
    }
    class MyOtherClass {
      static void useStaticContext(Context context) {
      }
      void useInstanceContext(Context context) {
      }
    }
    
    0 讨论(0)
  • 2020-12-25 10:16

    Use this in Activity:

    private Context context = this;
    
    ........
    if(Utils.isInternetAvailable(context){
    Utils.showToast(context, "toast");
    }
    ..........
    

    in Utils:

    public class Utils {
    
        public static boolean isInternetAvailable(Context context) {
            ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected();
        }
    
        public static void showToast(Context context, String text) {
            Toast toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
            toast.setGravity(Gravity.CENTER, 0, 0);
            toast.show();
        }
    }
    
    0 讨论(0)
  • 2020-12-25 10:17

    You can try the following, it allows you to get the current context the view is running through.

    alarmTest = (AlarmManager)this.getContext().getSystemService(Context.ALARM_SERVICE);
    
    0 讨论(0)
  • 2020-12-25 10:30

    You can pass the context to the non-activity class which is the preferred way or you could encapsulate the base context of the application to a singleton which would allow you to access the context anywhere within the application. At some cases this might be a good solution but in others its certainly not a good one.

    Anyway, if you want to trigger an alarm via the AlarmManager I'm pretty sure the alarm should inherit from a Service or better yet from IntentService and in such cases you have access to the context via this.getBaseContext() or this.getApplicationContext()

    0 讨论(0)
  • 2020-12-25 10:30

    You need to pass a context into the non-activity class.

    0 讨论(0)
提交回复
热议问题