2016-11-13 5 views
0

내 장치를 원격으로 관리하기 위해 사용하려는 서비스가 있습니다. 시작될 때 서버에 연결 한 다음 거기에서 명령을받는 것으로 가정합니다. 내 응용 프로그램을 시작할 때 일반적으로 나는 MainActivity가BootReceiver가 시작할 때 안드로이드 서비스가 이상하게 작동합니다.

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 [here] (http://stackoverflow.com/questions/12752598/check-online-status-android)에서 isOnline 함수를 사용하고 항상 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

이것은 도움이되지 않습니다. 시스템이 시작될 때 서비스가 자동으로 시작되면 "true"를 반환하지 않습니다. 나는 그 장치에 이상한 행동을하는 OEM과 관련된 것이라고 생각합니다. – Flole

+0

서비스를 실행하기 전에 실제로 1 분 후에 기다리는 경우 어떻게됩니까? 자동 시작 클래스에 정적 int 카운터를 추가하고 연결을 확인할 수 있습니다. 연결되지 않은 경우 알람을 설정하고 약간의 지연 후 연결을 테스트 할 수 있습니다. 카운터는 무한 루프를 방지하는 것입니다. 도움이 더 필요하면 알려주세요. –