2013-08-23 48 views
0

我正在開發一個Android應用程序,在該應用程序中,我必須驗證設備處於聯機還是脫機模式(即,我必須驗證連接服務是否可用,或者不)。Android-無法從另一個活動調用方法

我有兩個類A類和B類。

在A級,我試過代碼片段像下面,

package com.example.onlineverification; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Button b=(Button)findViewById(R.id.button1); 
     b.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       //new OnlineCheck().onCreate(savedInstanceState) 
       Toast.makeText(MainActivity.this,"Online Verification "+new OnlineCheck().isOnline(), Toast.LENGTH_LONG).show(); 

      } 
     }); 



     } 

} 

在B組,該代碼段,我試過下面給出,

package com.example.onlineverification; 

import android.app.Activity; 
import android.content.Context; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.Bundle; 


public class OnlineCheck extends Activity 
{ 



    public boolean isOnline() { 

     ConnectivityManager conMgr = (ConnectivityManager) this 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 

     NetworkInfo[] networkInfo = conMgr.getAllNetworkInfo(); 

     boolean state=false; 

     for(NetworkInfo nInfo:networkInfo){ 
      if(nInfo.getType()==ConnectivityManager.TYPE_WIFI || nInfo.getType()==ConnectivityManager.TYPE_ETHERNET || nInfo.getType()==ConnectivityManager.TYPE_MOBILE){ 
      if (nInfo.getState() == NetworkInfo.State.CONNECTED 
        || nInfo.getState() == NetworkInfo.State.CONNECTING) { 

       state=true; 
       break; 

      } 
      } 
     } 


     return state; 
    } 

} 

當我點擊按鈕,應用程序崩潰,我的Logcat錯誤如下,

08-23 10:55:29.152: E/AndroidRuntime(25945): FATAL EXCEPTION: main 
08-23 10:55:29.152: E/AndroidRuntime(25945): java.lang.IllegalStateException: System services not available to Activities before onCreate() 
08-23 10:55:29.152: E/AndroidRuntime(25945): at android.app.Activity.getSystemService(Activity.java:4463) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at com.example.onlineverification.OnlineCheck.isOnline(OnlineCheck.java:18) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at com.example.onlineverification.MainActivity$1.onClick(MainActivity.java:24) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at android.view.View.performClick(View.java:4204) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at android.view.View$PerformClick.run(View.java:17355) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at android.os.Handler.handleCallback(Handler.java:725) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at android.os.Handler.dispatchMessage(Handler.java:92) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at android.os.Looper.loop(Looper.java:137) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at android.app.ActivityThread.main(ActivityThread.java:5041) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at java.lang.reflect.Method.invokeNative(Native Method) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at java.lang.reflect.Method.invoke(Method.java:511) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at dalvik.system.NativeStart.main(Native Method) 
+0

-u只是在另一個類中使用static關鍵字來調用方法。 – FarhaSameer786

+1

你爲什麼不把這樣的小代碼放在這樣的班級中。只要保留在原來的活動 – NightSkyCode

+0

看到我的答案並嘗試。如果有任何問題,請告知 –

回答

0

這是你的B類

import android.app.Activity; 
import android.content.Context; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.Bundle; 

public class OnlineCheck 
{ 
    public boolean isOnline(Context context) { 

     ConnectivityManager conMgr = (ConnectivityManager) context 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 

     NetworkInfo[] networkInfo = conMgr.getAllNetworkInfo(); 

     boolean state=false; 

     for(NetworkInfo nInfo:networkInfo){ 
      if(nInfo.getType()==ConnectivityManager.TYPE_WIFI || nInfo.getType()==ConnectivityManager.TYPE_ETHERNET || nInfo.getType()==ConnectivityManager.TYPE_MOBILE){ 
      if (nInfo.getState() == NetworkInfo.State.CONNECTED 
        || nInfo.getState() == NetworkInfo.State.CONNECTING) { 

       state=true; 
       break; 

      } 
      } 
     } 


     return state; 
    } 

} 

並與下面的代碼

Toast.makeText(MainActivity.this,"Online Verification "+ new OnlineCheck().isOnline(MainActivity.this), Toast.LENGTH_LONG).show(); 
+0

最糟糕的實施方案!並得到upvote –

+0

你應該先嚐試一下。我知道問題在哪裏,我不認爲應該運行此代碼。 –

+0

而不是我的解決方案的副本:D –

0

這裏你得到IllegalException這意味着它稱之爲是不是在Android的

Runtime(25945): FATAL EXCEPTION: main 
08-23 10:55:29.152: E/AndroidRuntime(25945):java.lang.IllegalStateException: System services not available to Activities before onCreate() 
08-23 10:55:29.152: E/AndroidRuntime(25945):at android.app.Activity.getSystemService(Activity.java:4463) 

有效的,我建議你做這樣的事情

1) BaseActivity extends Activity 
2) OnlineCheck extends BaseActivity 
3) MainActivity extends BaseActivity 

然後代碼是用在博th活動將其記錄在BaseActivity中。

0

問題是您正在創建您的OnlineCheck實例,而無需通過創建活動的正確渠道。您應該將活動更改爲您的在線活動或將isOnline()移動到MainActivity中。

請參閱How to start new activity on button click從另一個裏面開始一個活動。

它的癥結在於你不能只調用新的MyActivity()。活動的目的不是要這樣初始化。

編輯:

這可能工作,如果你真的真的想在OnlineCheck類

Toast.makeText(MainActivity.this,"Online Verification "+OnlineCheck.isOnline(this), Toast.LENGTH_LONG).show(); 

public class OnlineCheck extends Activity 
{ 



    public static boolean isOnline(Activity source) { 

     ConnectivityManager conMgr = (ConnectivityManager) source 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 

     NetworkInfo[] networkInfo = conMgr.getAllNetworkInfo(); 

     boolean state=false; 

     for(NetworkInfo nInfo:networkInfo){ 
      if(nInfo.getType()==ConnectivityManager.TYPE_WIFI || nInfo.getType()==ConnectivityManager.TYPE_ETHERNET || nInfo.getType()==ConnectivityManager.TYPE_MOBILE){ 
      if (nInfo.getState() == NetworkInfo.State.CONNECTED 
        || nInfo.getState() == NetworkInfo.State.CONNECTING) { 

       state=true; 
       break; 

      } 
      } 
     } 


     return state; 
    } 

} 
3

不要從活動該方法。創建一個單獨的類並將該方法定義爲靜態。 像下面

import android.content.Context; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 

public class NetworkUtils { 

    public static boolean isOnline(Context mContext) { 
     ConnectivityManager conMgr = (ConnectivityManager) mContext 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo[] networkInfo = conMgr.getAllNetworkInfo(); 
     boolean state = false; 
     for (NetworkInfo nInfo : networkInfo) { 
      if (nInfo.getType() == ConnectivityManager.TYPE_WIFI 
        || nInfo.getType() == ConnectivityManager.TYPE_ETHERNET 
        || nInfo.getType() == ConnectivityManager.TYPE_MOBILE) { 
       if (nInfo.getState() == NetworkInfo.State.CONNECTED 
         || nInfo.getState() == NetworkInfo.State.CONNECTING) { 
        state = true; 
        break; 
       } 
      } 
     } 
     return state; 
    } 
} 

而作爲

NetworkUtils.isOnline(MainActivity.this); 

調用此方法在活動你的情況

Toast.makeText(MainActivity.this,"Online Verification "+NetworkUtils.isOnline(MainActivity.this), Toast.LENGTH_LONG).show(); 
+1

很好的迴應,非常有幫助 – PALEN

0

在2。活動導入MainActivity第一

例如你在2.Activity你要給方法從2.Activity論方法callMethode()

活性1(有關MainActivity實施例)的MainActivity名稱

public static void callMethode(Context context){ 
    // Your codes Here 
    } 

活動2

MainActivity.callMethode(getApplicationContext()); 
相關問題