2016-11-13 6 views
0

デバイスをリモート管理するために使用したいサービスがあります。起動すると、サーバに接続してそこからコマンドを受け取ることになっています。私は私のアプリを起動すると、通常、私はこれは完全に正常に動作BootReceiverが起動したときにAndroidサービスが異常に動作する

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

を使用して、私のサービスをMainActivityの火を持っています。しかし、autostart.classがサービスを起動すると、ホストを解決できないことが報告されます。だから、私はそれが接続されるまで1秒ごとに再試行しただけですが、ネットワーク接続が正常に機能していても接続できません。アプリケーションアイコンをクリックすると、古いサービスが終了し、新しいサービスが開始され、接続され、すべて正常に動作しますが、自動起動では機能しません。それは起動時にサービスにパーミッションがないようですが、私はそれについては分かりません。一般的に

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 [here](http://stackoverflow.com/questions/12752598/check-online-status-android)からisOnline関数を使用していますが、常にfalseを返しています。また、MQTTクライアント・ライブラリーを使用するだけでは、ホスト名を解決できないという不満があります。 – Flole

答えて

0

I(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

これは私を助けません。システムの起動時にサービスが自動的に開始されると、「true」を返すことはありません。私はそれが、そのデバイス上で奇妙な動作をしているOEM関連のものだと思います。 – Flole

+0

サービスを実行する前に実際にBOOTから1分待っているとどうなりますか?静的なintカウンタを自動スタートクラスに追加し、接続をチェックすることができます。接続されていない場合は、アラームを設定して接続をテストすることができます。カウンタは、無限ループを防ぐことになります。もっと助けが必要なら私に知らせてください。 –

関連する問題