2016-09-11 3 views
1

장치를 재부팅 한 후 내 Service을 시작하고 싶습니다. 코드를 작성했지만 재부팅 할 때 장치가 시작되지 않습니다. Service.
매니페스트 :안드로이드에서 장치를 재부팅 한 후 서비스를 시작하는 방법

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

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name=".alarm1.alarm1"></activity> 

     <receiver android:name=".alarm1.AlarmReceiver"> 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED"/> 
      </intent-filter> 
     </receiver> 

     <!-- Will not be called unless the application explicitly enables it --> 
     <receiver android:name=".alarm1.DeviceBootReceiver" 
      android:enabled="false"> 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED"/> 
      </intent-filter> 
     </receiver> 

활동 코드 :

public class alarm1 extends AppCompatActivity { 

    private PendingIntent pendingIntent; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_alarm1); 

      /* Retrieve a PendingIntent that will perform a broadcast */ 
     Intent alarmIntent = new Intent(getApplicationContext(), AlarmReceiver.class); 
     pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, 0); 

     findViewById(R.id.startAlarm).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       start(); 
      } 
     }); 

     findViewById(R.id.stopAlarm).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       cancel(); 
      } 
     }); 

     findViewById(R.id.stopAlarmAt10).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       startAt10(); 
      } 
     }); 
    } 

    public void start() { 
     AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     int interval = 8000; 

     manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent); 
     Toast.makeText(this, "Alarm Set", Toast.LENGTH_SHORT).show(); 
    } 

    public void cancel() { 
     AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     manager.cancel(pendingIntent); 
     Toast.makeText(this, "Alarm Canceled", Toast.LENGTH_SHORT).show(); 
    } 

    public void startAt10() { 
     AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     int interval = 1000 * 60 * 20; 

     /* Set the alarm to start at 10:30 AM */ 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 
     calendar.set(Calendar.HOUR_OF_DAY, 17); 
     calendar.set(Calendar.MINUTE, 15); 

     Toast.makeText(alarm1.this, "Start at 17:11", Toast.LENGTH_SHORT).show(); 

     /* Repeating on every 20 minutes interval */ 
     manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
       1000 * 60 * 3, pendingIntent); 
    } 
} 

AlarmReceiver 코드 :

public class AlarmReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     // For our recurring task, we'll just display a message 
     Toast.makeText(context, "I'm running", Toast.LENGTH_SHORT).show(); 
    } 
} 

DeviceBootReceiver 코드 :

public class DeviceBootReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { 
      /* Setting the alarm here */ 
      Intent alarmIntent = new Intent(context, AlarmReceiver.class); 
      PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0); 

      AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
      int interval = 8000; 
      manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent); 

      Toast.makeText(context, "Alarm Set", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

어떻게이 문제를 해결할 수 있습니다 때 부팅 장치는 Service을 시작?

+0

매니페스트에'RECEIVE_BOOT_COMPLETED' 권한을 추가 했습니까? – earthw0rmjim

+0

@ user13 아니요,이 권한이 추가되지 않았습니다. –

답변

0

매니페스트에 사용 권한을 추가하십시오.

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

수신자 항목을 매니페스트에 추가하십시오.

<receiver android:enabled="true" android:name=".alarm1.DeviceBootReceiver" 
     android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </receiver> 
0

당신은

  1. 요청 권한 필요

  1. 가 명시 적으로 수신기 수 있습니다. 사용자가 알람을 설정하면 (예를 들어 당신의 start 방법에 대한), 부트 ​​수신기를 사용하도록 설정하면 다음

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 
    

    :

    ComponentName receiver = new ComponentName(context, DeviceBootReceiver.class); 
    getPackageManager().setComponentEnabledSetting(receiver, 
        PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
        PackageManager.DONT_KILL_APP); 
    

사용 권한은 매니페스트 파일에 간다 사용자가 모든 경보를 취소 한 경우 비슷한 코드를 사용하여 부트 수신기를 비활성화해야합니다.

관련 문제