2016-01-09 5 views
0

Я использую push-уведомление в своем проекте, и оно работает нормально, но оно не работает, когда мое приложение не работает. Он отображается только при открытии моего приложения.Push Notification не отображается, когда приложение не работает в android

Вот мой GCMIntentService.java:

public class GCMIntentService extends GCMBaseIntentService { 

private static final String TAG = "GCMIntentService"; 

public GCMIntentService() { 
    super(SENDER_ID); 
} 

/** 
* Method called on device registered 
**/ 
@Override 
protected void onRegistered(Context context, String registrationId) { 
    Toast.makeText(getApplicationContext(), "on res", 11).show(); 
    Log.i(TAG, "Device registered: regId = " + registrationId); 
    displayMessage(context, "Your device "+registrationId); 

    ServerUtilities.register(context, "", "", registrationId); 
} 

/** 
* Method called on device un registred 
* */ 
@Override 
protected void onUnregistered(Context context, String registrationId) { 
    Toast.makeText(getApplicationContext(), "on fail", 11).show(); 
    Log.i(TAG, "Device unregistered"); 
    displayMessage(context, getString(R.string.gcm_unregistered)); 
    ServerUtilities.unregister(context, registrationId); 
} 

/** 
* Method called on Receiving a new message 
* */ 
@Override 
protected void onMessage(Context context, Intent intent) { 
    Log.i(TAG, "Received message"); 
    String message = intent.getExtras().getString("price"); 

    displayMessage(context, message); 

// 

    // notifies user 
    generateNotification(context, message); 




} 

/** 
* Method called on receiving a deleted message 
* */ 
@Override 
protected void onDeletedMessages(Context context, int total) { 
    Log.i(TAG, "Received deleted messages notification"); 
    String message = getString(R.string.gcm_deleted, total); 
    PowerManager.WakeLock sWakeLock; 
    //int pm = PowerManager.FromContext(context); 
    // sWakeLock = pm.NewWakeLock(WakeLockFlags.Partial, "GCM Broadcast Reciever Tag"); 
    //sWakeLock.Acquire(); 
    WakeLocker.acquire(getApplicationContext()); 
    displayMessage(context, message); 

     /*if (extras.getString("message").length() != 0) { 
     createNotification(context, extras); 
     }*/ 
     generateNotification(context, message);//registration id on gcm device registratio 

    // notifies user 

     WakeLocker.release(); 


} 

/** 
* Method called on Error 
* */ 
@Override 
public void onError(Context context, String errorId) { 
    Log.i(TAG, "Received error: " + errorId); 
    displayMessage(context, getString(R.string.gcm_error, errorId)); 
} 

@Override 
protected boolean onRecoverableError(Context context, String errorId) { 
    // log message 
    Log.i(TAG, "Received recoverable error: " + errorId); 
    displayMessage(context, getString(R.string.gcm_recoverable_error, 
      errorId)); 
    return super.onRecoverableError(context, errorId); 
} 

/** 
* Issues a notification to inform the user that server has sent a message. 
*/ 
private static void generateNotification(Context context, String message) { 
    int icon = R.drawable.ic_launcher; 
    long when = System.currentTimeMillis(); 
    NotificationManager notificationManager = (NotificationManager) 
      context.getSystemService(Context.NOTIFICATION_SERVICE); 
    Notification notification = new Notification(icon, message, when); 

    String title = context.getString(R.string.app_name); 

    Intent notificationIntent = new Intent(context, Login.class); 
    // set intent so it does not start a new activity 
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | 
      Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    PendingIntent intent = 
      PendingIntent.getActivity(context, 0, notificationIntent, 0); 
    notification.setLatestEventInfo(context, title, message, intent); 
    notification.flags |= Notification.FLAG_AUTO_CANCEL; 

    // Play default notification sound 
    notification.defaults |= Notification.DEFAULT_SOUND; 

    //notification.sound = Uri.parse("android.resource://" + context.getPackageName() + "your_sound_file_name.mp3"); 

    // Vibrate if vibrate is enabled 
    notification.defaults |= Notification.DEFAULT_VIBRATE; 
    notificationManager.notify(0, notification);  
} 

} 

А вот мой класс вещания: -

public class Login extends ActionBarActivity { 


    Button login; 
    JSONParserwithdata jsonParser = new JSONParserwithdata(); 
    public static String RegId =""; 
    public static String deviceid =""; 
    public database db; 
    ConnectionDetector conDetector; 
    Boolean shutDown = false; 
    Boolean netStatus=false; 
    EditText school_id,mobile,password; 
    String user_id; 
    AsyncTask<Void, Void, Void> mRegisterTask; 

    // Alert dialog manager 
    AlertDialogManager alert = new AlertDialogManager(); 

    // Connection detector 
    ConnectionDetector cd; 

    String school_id_db,mobileno_db,pssword_db,device_id_db; 
    ProgressDialog pDialog; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     final AlertDialog ad=new AlertDialog.Builder(this).create(); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_login); 
     ///code for push notification device registered 
     try{ 
     cd = new ConnectionDetector(getApplicationContext()); 

     // Check if Internet present 
     if (!cd.isConnectingToInternet()) { 
      // Internet Connection is not present 
      alert.showAlertDialog(Login.this, 
        "Internet Connection Error", 
        "Please connect to working Internet connection", false); 
      // stop executing code by return 
      return; 
     } 

     // Getting name, email from intent 
     Intent i = getIntent(); 

     /*name = i.getStringExtra("name"); 
     email = i.getStringExtra("email");*/   

     // Make sure the device has the proper dependencies. 

     GCMRegistrar.checkDevice(this); 

     // Make sure the manifest was properly set - comment out this line 
     // while developing the app, then uncomment it when it's ready. 
     GCMRegistrar.checkManifest(this); 

     //lblMessage = (TextView) findViewById(R.id.lblMessage); 

     registerReceiver(mHandleMessageReceiver, new IntentFilter(
       DISPLAY_MESSAGE_ACTION)); 

     // Get GCM registration id 
     final String regId = GCMRegistrar.getRegistrationId(this); 

     // (Check if regid already presents 
     if (regId.equals("")) { 
      // Registration is not present, register now with GCM   
      GCMRegistrar.register(this, SENDER_ID); 

     } else { 
      // Device is already registered on GCM 
      if (GCMRegistrar.isRegisteredOnServer(this)) { 
       // Skips registration.    
       Toast.makeText(getApplicationContext(), "Already registered with GCM", Toast.LENGTH_LONG).show(); 
      } else { 
       // Try to register again, but not in the UI thread. 
       // It's also necessary to cancel the thread onDestroy(), 
       // hence the use of AsyncTask instead of a raw thread. 
       Toast.makeText(getApplicationContext(), "id "+regId, Toast.LENGTH_LONG).show(); 

       /*final Context context = this; 
       mRegisterTask = new AsyncTask<Void, Void, Void>() { 

        @Override 
        protected Void doInBackground(Void... params) { 
         // Register on our server 
         // On server creates a new user 
         ServerUtilities.register(context, name, email, regId); 
         return null; 
        } 

        @Override 
        protected void onPostExecute(Void result) { 
         mRegisterTask = null; 
        } 

       }; 
       mRegisterTask.execute(null, null, null);*/ 
      } 
     } 
     } 
     catch(Exception e) 
     { 
      ad.setMessage(e.getMessage()); 
      ad.show(); 
     } 
     //end for device registration 
     getActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#66BF77"))); 
     conDetector= new ConnectionDetector(this); 
     school_id=(EditText)findViewById(R.id.school_id); 
     password=(EditText)findViewById(R.id.password); 
     mobile=(EditText)findViewById(R.id.mobile_no); 
     login=(Button)findViewById(R.id.sign_in); 
     db=new database(this); 

     TelephonyManager tm = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 

     device_id_db = tm.getDeviceId(); 

     login.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       //final AlertDialog ad=new AlertDialog.Builder(this).create(); 
       String VRegId=RegId; 
       RegId=RegId.replace("Your device ", ""); 
       int pos2=RegId.indexOf("Trying"); 
       if(pos2>0) 
       RegId=RegId.substring(0,pos2); 

       if(mobile.getText().toString().length()!=0) 
       { 
        if(school_id.getText().toString().length()!=0) 
        { 
         if(password.getText().toString().length()!=0) 
         { 

          netStatus=conDetector.isConnectingToInternet(); 
           if(netStatus) 
            { 
            AttemptLogin task = new AttemptLogin(); 
             task.execute(); 
            } 
           else 
           { 
            Toast.makeText(getBaseContext(), "Internet connection problem", Toast.LENGTH_LONG).show(); 

           } 

         } 
         else 
         { 
          password.setError("Please enter password"); 
         } 
        } 
        else 
        { 
         school_id.setError("Please enter school id"); 
        } 
       } 
       else 
       { 
        mobile.setError("Please enter mobile number"); 
       } 
      } 
     }); 
    } 
    class AttemptLogin extends AsyncTask<String, String, String> { 

     String success_response; 
     int postpg=0; 
     String type; 
     String sc_id; 
     String logo_url; 
     String actionbar_title,target_data; 
     JSONArray targetrarry,userArray; 
     /** 
     * Before starting background thread Show Progress Dialog 
     * */ 
     boolean failure = false; 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(Login.this); 
      pDialog.setCanceledOnTouchOutside(false); 

      pDialog.setMessage("Attempting login..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(true); 
      pDialog.show(); 
     } 

     @Override 
     protected String doInBackground(String... args) { 
      // TODO Auto-generated method stub 


      try { 



       List<NameValuePair> params = new ArrayList<NameValuePair>(); 
       params.add(new BasicNameValuePair("mobileno",mobile.getText().toString())); 
       params.add(new BasicNameValuePair("uid", school_id.getText().toString())); 
       params.add(new BasicNameValuePair("pass", password.getText().toString())); 
       params.add(new BasicNameValuePair("regid", RegId)); 
       params.add(new BasicNameValuePair("deviceid", deviceid)); 
       JSONArray mainjson = jsonParser.makeHttpRequest(
         "http://ddlindialtd.com/webservice/service1.asmx/getSchool", "POST", params); 
       for(int i=0; i<mainjson.length(); i++) 
       { 
        JSONObject mainobj=mainjson.getJSONObject(i); 
         success_response=mainobj.getString("status"); 
         JSONArray resultjsonarray = mainobj.getJSONArray("result"); 


         for(int j=0; j<resultjsonarray.length(); j++) 
         { 
          JSONObject innerobj=resultjsonarray.getJSONObject(j); 
          type=innerobj.getString("Usertype"); 
          logo_url=innerobj.getString("schoolLogo"); 
          actionbar_title=innerobj.getString("schoolTitle"); 
          sc_id=innerobj.getString("id"); 
          targetrarry=innerobj.getJSONArray("targetdata"); 
          userArray=innerobj.getJSONArray("userdata"); 
          for(int k=0;k<userArray.length();k++) 
          { 
            JSONObject userjsonobj=userArray.getJSONObject(k); 
            user_id=userjsonobj.getString("vfromid"); 
          } 
         } 
       } 


      } catch (Exception e) { 

       success_response = getBaseContext().getString(R.string.error)+","+e.getMessage(); 
      } 

      return success_response; 

     } 

     protected void onPostExecute(String file_url) { 
      pDialog.dismiss(); 

      if(file_url.equals("404 server error")) 
      { 
       Toast.makeText(getBaseContext(), file_url, Toast.LENGTH_LONG).show(); 

      } 
      else 
      { 
      if(file_url.equals("success")) 
      { 
       if(type.equals("parent")) 
       { 
        mobileno_db=mobile.getText().toString(); 
        school_id_db=school_id.getText().toString(); 
        pssword_db=password.getText().toString(); 
        db.store(user_id,type,mobileno_db,school_id_db,pssword_db,device_id_db,RegId,deviceid); 

        Intent intent=new Intent(Login.this,ListofClass.class); 
        intent.putExtra("Logo", logo_url); 
        intent.putExtra("Title", actionbar_title); 
        intent.putExtra("JSON", targetrarry.toString()); 
        overridePendingTransition(R.animator.acitivity_transation, R.animator.activity_animation_2); 
        startActivity(intent); 

       } 
       else 
       { 
        mobileno_db=mobile.getText().toString(); 
        school_id_db=school_id.getText().toString(); 
        pssword_db=password.getText().toString(); 
        db.store(user_id,type,mobileno_db,school_id_db,pssword_db,device_id_db,RegId,deviceid); 

        Intent intent=new Intent(Login.this,ListofClass.class); 
        intent.putExtra("Logo", logo_url); 
        intent.putExtra("Title", actionbar_title); 
        intent.putExtra("JSON", targetrarry.toString()); 
        overridePendingTransition(R.animator.acitivity_transation, R.animator.activity_animation_2); 
        startActivity(intent); 

       } 
      } 
      else 
      { 
       Toast.makeText(getBaseContext(), "Unaouthorised Access", Toast.LENGTH_LONG).show(); 
      } 
      } 

     } 

     } 


    private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      //ComponentName comp=new ComponentName(context.getPackageName(),GCMIntentService.class.getName()); 
      //startWakefulService(context, intent.setComponent(comp)); 
      //WakeLocker.acquire(getApplicationContext()); 
      //setResultCode(Activity.RESULT_OK); 
      String newMessage = intent.getExtras().getString(EXTRA_MESSAGE); 
      // Waking up mobile if it is sleeping 
      WakeLocker.acquire(getApplicationContext()); 

      /** 
      * Take appropriate action on this message 
      * depending upon your app requirement 
      * For now i am just displaying it on the screen 
      * */ 

      // Showing received message 
     // lblMessage.append(newMessage + "\n");   
      Toast.makeText(getApplicationContext(), "New Message: " + newMessage, Toast.LENGTH_LONG).show(); 
      //if(RegId.equals("")) 
      RegId=RegId+newMessage; 
      // Releasing wake lock 
      WakeLocker.release(); 
     } 
    }; 

    @Override 
    protected void onDestroy() { 
     if (mRegisterTask != null) { 
      mRegisterTask.cancel(true); 
     } 
     try { 
      unregisterReceiver(mHandleMessageReceiver); 
      GCMRegistrar.onDestroy(this); 
     } catch (Exception e) { 
      Log.e("UnRegister Receiver Error", "> " + e.getMessage()); 
     } 
     super.onDestroy(); 
    } 

} 
+0

Эта ссылка [https://github.com/phonegap-build/PushPlugin/issues/85] может быть вам полезна. Одно из предложений заключается в том, чтобы сделать это с настройками вашего телефона «разрешить приложению автоматически запускаться в приложении Security Center> Разрешения> Автозапуск> включить приложение». – gerardnimo

ответ

0

Try дать разрешение WAKE_LOCK в Android Manifest файл

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

It сделает процессор бодрствующим, если телефон перейдет спать

Смежные вопросы