全局函数访问系统功能android

时间:2013-01-23 20:58:40

标签: android

我已经创建了一个全局动作类并在这个类中创建了函数,我正试图在另一个活动中访问我遇到的问题是在eclipse中我遇到了访问系统功能的函数的编码错误比如getSystemService()和getApplicationContext()有没有人知道为什么或如何让全局类接受系统功能?

继续我到目前为止看到的是我的GloblActions.java

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;

public class GlobalActions{
        Context mContext;

        // constructor
        public GlobalActions(Context context){
            this.mContext = context;
        }


        public final static boolean isOnline (Context someContext){ {

            Log.v("globals", "isonline");

    ConnectivityManager cm = (ConnectivityManager) someContext.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();

        if (netInfo != null && netInfo.isConnectedOrConnecting()) {
            return true;
        }
        return false;
        }

}



        public final static void checkInternet(Context someContext){

                    isOnline(someContext);
                    if(isOnline(someContext) == false){
                       Log.v("globals", "isOnline = false");
                       Intent register = new Intent(someContext.getApplicationContext(), LoginForm.class);
                       someContext.startActivity(register);
                    }
                }



        }   

继承人我在活动中使用该功能。我的目标是通过调用全局函数检查每个活动的互联网连接,如果没有找到连接则转到没有互联网连接的活动。

import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.TextView;
import android.os.Handler;
import com.myApp.myApp.GlobalActions;

public class IntroLoader extends Activity {

    public Handler handler;
    public TextView loadText = null;
    public Animation AniFadein = null;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lo_introloader);
        findViewById(R.id.progressBar1).setVisibility(View.GONE);
        findViewById(R.id.loadTextView).setVisibility(View.GONE);
         GlobalActions.isOnline(null);
         GlobalActions.checkInternet(null);

        handler = new Handler();
        final Runnable fadeIn = new Runnable()
        {
            public void run() 
            {
               animations();
               findViewById(R.id.progressBar1).setVisibility(View.VISIBLE);
               findViewById(R.id.loadTextView).setVisibility(View.VISIBLE);
                         }
        };
        handler.postDelayed(fadeIn, 3000);

        final Runnable aSyncTask= new Runnable()
        {
            public void run() 
            {

               PostTask posttask;
               posttask = new PostTask();
               posttask.execute();

            }
        };
        handler.postDelayed(aSyncTask, 4000);

    }

    public void animations(){

        loadText = (TextView)findViewById(R.id.loadTextView);
        AniFadein = AnimationUtils.loadAnimation(this, R.anim.fadein);  
        loadText.startAnimation(AniFadein); 

    }


  public class PostTask extends AsyncTask<Void, String, Boolean> {

        protected void onPreExecute() {
            super.onPreExecute();

        }

        @Override
        protected Boolean doInBackground(Void... params) {
            boolean result = false;
            publishProgress("progress");
            return result;
        }

        protected void onProgressUpdate(String... progress) {
            StringBuilder str = new StringBuilder();
                for (int i = 1; i < progress.length; i++) {
                    str.append(progress[i] + " ");

                }
        }

            @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);
            checkLoginData();
          }
    }

  public void checkLoginData(){

      Intent register = new Intent(getApplicationContext(), LoginForm.class);
      startActivity(register);


  }         



}

1 个答案:

答案 0 :(得分:2)

待办事项

 ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);

上下文可以使用方法getSystemService(),但您的类不是上下文,您需要使用mContext变量。

这意味着您也可以将getApplicationContext()替换为mContext。如果您确实需要getApplicationContext()(不太可能 - 正常的上下文应该可以正常工作),请使用

mContext.getApplicationContext()

此外,您将isOnline()方法声明为静态,但是您需要使用Context来检查和制作Toast。要么不使它静态更改它,以便它在上下文中接受,例如

public final static boolean isOnline (Context someContext){

并替换需要带有someContext的上下文的调用。静态方法不需要类的实例,因此,您不能使用mContext。一旦修复了现在的getApplicationContext()问题,编译器就会抛出一个以静态方式访问非静态字段的错误。与您的checkInternet()相同。我建议你重新评估你的逻辑,你的类有多个问题 - 我建议将一切都设置为一个静态方法,在一个Context中接受,它将由调用Activity给出。

最后要注意在全局非ui类中显示Toasts和其他UI元素。 Toasts应该没问题,因为它们在windows上运行,但是Dialog需要一个窗口,如果mContext不是Activity的实例,那将失败(活动有一个窗口,其他上下文(像getApplicationContext()),不要。