2016-11-13 16 views
0

我有一個服務,我想用於遠程管理我的設備。當它啓動時,它應該連接到服務器,然後從那裏接收命令。當我開始我的應用程序通常我都在MainActivity使用由BootReceiver啓動的Android服務表現怪異

startService(new Intent(this, service.class));

這工作完全正常火了我的服務。但是,當autostart.class啓動服務時,報告它無法解析主機。所以我只是每秒都會重試一次,直到它連接上去,但即使網絡連接正常並且工作完美,它也永遠無法連接。當我點擊應用程序圖標時,它會殺死舊服務,啓動一個新服務,連接並且一切正常,但不會自動啓動。這就像服務啓動時沒有任何權限,但我不確定。

autostart.class

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class autostart extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) { 
     Intent pushIntent = new Intent(context, service.class); 
     pushIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startService(pushIntent); 
     Log.i("Boot Receiver", "Service started"); 
     } 
    } 

} 

AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="my.app.rtl" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="21" 
     android:targetSdkVersion="25" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> 
    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 

     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:theme="@style/Theme.Transparent" 
      android:name=".DialogActivity" 
      android:label="@string/app_name" > 
     </activity> 
     <receiver android:name=".autostart"> 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
     </receiver> 
     <receiver 
      android:name=".Darclass" 
      android:permission="android.permission.BIND_DEVICE_ADMIN" > 
      <meta-data 
       android:name="android.app.device_admin" 
       android:resource="@xml/my_admin" /> 

      <intent-filter> 
       <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> 
      </intent-filter> 
     </receiver> 
     <service android:enabled="true" android:isolatedProcess="false" android:persistent="true" android:name=".service" /> 
    </application> 
</manifest> 
+0

接收機對我來說很好。問題可能在服務中。 –

+0

@ Edouser1419293我使用isOnline函數從[這裏](http://stackoverflow.com/questions/12752598/check-online-status-android),它總是返回false。另外如果我只是使用我的MQTT客戶端庫,它會抱怨無法解析主機名。 – Flole

回答

0

總的來說,我檢查這個連通性(儘管getAllNetworkInfo已廢棄)

public boolean areWeConnected(){ 
    /** 
    * isConnected() 
    * Indicates whether network connectivity exists and it is possible to establish connections and pass data. 
    * Always call this before attempting to perform data transactions. 
    */ 
    boolean haveConnectedWifi = false; 
     boolean haveConnectedMobile = false; 

     ConnectivityManager cm = (ConnectivityManager) getSystemService(getApplicationContext().CONNECTIVITY_SERVICE); 
     NetworkInfo[] netInfo = cm.getAllNetworkInfo(); 
     for (NetworkInfo ni : netInfo) { 
      if (ni.getTypeName().equalsIgnoreCase("WIFI")) 
       if (ni.isConnected()){ 
        haveConnectedWifi = true; 
        break; 
        } 
      if (ni.getTypeName().equalsIgnoreCase("MOBILE")) 
       if (ni.isConnected()){ 
        haveConnectedMobile = true; 
        break; 
       } 
     } 
     return haveConnectedWifi || haveConnectedMobile; 
} 
+0

這對我沒有幫助。當服務在系統啓動時自動啓動時,它從不返回「真」。我認爲這是與OEM相關的,在該設備上表現出奇怪的東西。 – Flole

+0

如果您在運行服務之前實際等待BOOT 1分鐘後會發生什麼情況?您可以向自動啓動類添加靜態int計數器並檢查連通性。如果沒有連接,您可以設置一個警報並在延遲後測試連接。計數器將防止無限循環。如果您需要更多幫助,請告訴我。 –