2017-01-31 82 views
3

我做了一个IntentService在您启动您的手机和当您在应用程序时在后台搜索通知。
它的工作,现在我意识到,当我杀了应用程序(在多任务),我不再收到新的通知。

您知道如何在用户终止应用程序时启动(或重新启动)IntentService?

关于internet它被告知这是不可能的,但当我启动Facebook的Messenger应用程序并杀死它时,我总是会收到通知!如何启动/重新启动IntentService当用户杀死应用程序

PS:我正在使用我的网络服务器存储通知,我不想用其他方式(如Google的解决方案),因此节省您的时间,并且不要尝试转换我:P

这是我的代码,如果它可以帮助人在未来的危机,或者你就明白了:
AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="fr.antoineduval.sortirauhavre"> 

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

<application 
    android:name=".MyApplication" 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

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

    <receiver android:name="fr.antoineduval.sortirauhavre._MyBroadcastReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 

    <service 
     android:name="._MyService" 
     android:exported="false"/> 

</application> 

广播接收器

public class _MyBroadcastReceiver extends BroadcastReceiver{ 
    @Override 
    public void onReceive(Context context, Intent intent){ 
     Intent startServiceIntent = new Intent(context, _MyService.class); 
     context.startService(startServiceIntent); 
    } 
} 

IntentService

public class _MyService extends IntentService{ 

    private final int INTERVAL = 1000 ; // 1 sec 

    private MyApplication application; 
    private Timer timer; 

    public _MyService(){ 
     super(_MyService.class.getName()); 
    } 

    @Override 
    public void onCreate(){ 
     super.onCreate(); 
     this.application = (MyApplication)getApplication(); 
    } 

    @Override 
    protected void onHandleIntent(Intent workIntent){ 
     this.timer = new Timer(); 
     timer.schedule(new TimerTask(){ 
      public void run(){ 
       try{ 
        check_notification(); 
       } catch (IOException e){ 
        e.printStackTrace(); 
       } catch (JSONException e){ 
        e.printStackTrace(); 
       } 
      } 
     }, 0, this.INTERVAL); 
    } 

    private void check_notification() throws IOException, JSONException { 
     String url = MyApplication.NOTIFICATION_URL+"php/form/get.php?site="+MyApplication.NOTIFICATION_SITE_ID+"&last_notification_id="+this.application.get_cookie("last_notification_id"); 
     URL address = new URL(url); 
     URLConnection conn = address.openConnection(); 
     InputStream is = conn.getInputStream(); 
     ArrayList<String> array = this.application.json_string_to_array(this.application.stream_to_string(is)); 
     for(int cpt = 0; cpt<array.size(); cpt++){ 
      String response = array.get(cpt); 
      JSONObject obj = new JSONObject(response); 

      int id = Integer.parseInt(obj.getString("id")); 
      String text = obj.getString("text"); 
      String title = obj.getString("title"); 
      String action = obj.getString("url"); 

      if(id > Integer.parseInt(this.application.get_cookie("last_notification_id"))) 
       this.application.set_cookie("last_notification_id", id+""); 

      this.application.send_notification(title, text, id, action); 
     } 
    } 
} 

回答

0

请不要在两件事情之间的混淆。 Facebook拥有自己的SDK来管理通知服务。就像FCM一样,您只需注册一次,FCM库为您提供回调方法,您可以在其中收到它。坦率地说,Facbook通知机制并不仅仅依赖于启动和停止服务。 对于您尝试使用服务而不是intentService,并在服务覆盖onStart()命令与返回布尔变量返回START_STICKY; 虽然这不是可取的,并且完全安全,但它在大多数情况下都能正常工作,直到内核决定停止它为止。

+0

感谢您的帮助,为了确保我的理解,您告诉我要将我的intentService转换为服务。我尝试过,但是当我这样做时,我的通知将不起作用。你确定我可以通过简单的服务进行通知吗? – Antoine

相关问题