0

Редакция: Передачи android.intent.action.DOWNLOAD_COMPLETE принимается только в том случае, если приложение запущено или находится в фоновом режиме. Если приложение убито, то передача никогда не принималась.Broadcast DOWNLOAD_COMPLETE не получен, если приложение не запущено

AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> 
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" /> 
<uses-permission android:name="android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS" /> 

<receiver 
    android:name=".adapters.VideoListAdapter$VideoDownloadedReceiver" 
    android:exported="true"> 

    <intent-filter> 
     <action android:name="android.intent.action.DOWNLOAD_COMPLETE" /> 
    </intent-filter> 
</receiver> 

Класс приемника

public static class VideoDownloadedReceiver extends BroadcastReceiver implements AsyncResponse { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.i("YES", "in receive"); 
    } 
} 

Пожалуйста, обратите внимание, что я столкнулся этот вопрос не во всех устройствах.

Устройства, на которых я столкнулся этот вопрос: Lenevo A600, Asus Zenfone Макс

устройства, на котором он прекрасно работает: Asus Zenfone 5 (CyanogenMod 13), Android-студия Emulator (Nexus 6p зефир), Samsung J7 Prime, Samsung J5, Nexus 5

+0

Пожалуйста, смотрите мой ответ HTTPS : //stackoverflow.com/a/44415369/6548766 –

ответ

0

Я думаю, что причина может быть связана с настройки ROM, ограничила вещание, CM, АСОП, является изначально Syste m.so ,,,

0

если вы хотите получить передачу даже после того, как приложение закрыто, то вы должны использовать передачу в службу

следующее поможет реализовать: - https://stackoverflow.com/a/16824692/4246910

+0

Я создал службу и сделал трансляцию в ней, но все же d oes не вызывает метод onReceive, если приложение убито.Метод onReceive службы, вызываемый при запуске приложения –

0

Приемник, как представляется, внутренний класс. Поскольку приложение уничтожено, так это ваш внутренний класс приемника, который является частью разрушенного класса.

Я основывая это предположение, потому что ваш манифест имеет

android:name=".adapters.VideoListAdapter$VideoDownloadedReceiver".

Отделите «BroadcastReceiver» на свой класс, и он должен работать должным образом.

Что касается работы на некоторых телефонах, я бы проверял запуск других приложений и то, какие приложения для подавления приложений могут работать в фоновом режиме, что может способствовать принудительному закрытию вашего приложения.

у вас должно быть что-то вроде этого. Я посмотрел код, и у вас есть вложенный получатель, но вы не держите эту услугу.

функцию вызова для начала действия

private void startDownloadService() { 
    Intent downloadIntent = new Intent(this, VideoDownloadReceiverService.class); 

    if (!VideoDownloadReceiverService.isRunning()) { 
     // My manifest has enabled="false" so i do this to turn it 'ON' 
     component = new ComponentName(CounterActivity.this, VideoDownloadReceiverService.class); 
     getPackageManager() 
       .setComponentEnabledSetting(component, 
         PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
         PackageManager.DONT_KILL_APP); 
     // Start the service 
     startService(downloadIntent); 
    } 
} 

в отдельном файле здесь является служба

public class VideoDownloadReceiverService extends Service{ 

    private static boolean isRunning = false; 

    public VideoDownloadReceiverService(){ 

    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     // you may not need this since oyu register it in the Manifest. the fact the service is running 
     // should keep your app alive and receiving and unable to be shutdown 
     // but this is what i did 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(DownloadManager.ACTION_DOWNLOAD_COMPLETE); 
     receiver = new VideoDownloadReceiver(); 
     registerReceiver(receiver, filter); 

     Notification notification = new NotificationCompat.Builder(this) 
       .setSmallIcon(R.drawable.ic_launcher) 
       .setContentText("Viewer Text In Notification").build(); 
     startForeground(MyConstants.NOTIFICATION_ID, notification); 

     isRunning = true; 
     return START_STICKY; // This is the line that keeps the service running no matter what 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

    @Override 
    public void onDestroy(){ 
     unregisterReceiver(receiver); 
     super.onDestroy(); 
    } 
} 

В отдельном файле, здесь является приемником

public class VideoDownloadReceiver extends BroadcastReceiver { 
    public VideoDownloadReceiver() { 

    } 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE); 
     PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
       "com.example.johnbravado.zionwork"); 
     wakeLock.acquire(); 

     Toast.makeText(context, "in service", Toast.LENGTH_SHORT).show(); 
     Log.i("YES", "service on receive"); 

     wakeLock.release(); 
    } 
} 
+0

, сделал другой звонок для широковещательного приемника, но все еще не имеет успеха. –

+0

вы можете показать, как вы делаете sendBoradcast –

+0

, чтобы отправить трансляцию. Я регистрируюсь в файле manifex. –