2015-11-28 56 views
0

我試圖通過推送數據從接收器到使用意圖的活動,它似乎並沒有工作。任何想法爲什麼?下面是我的實現:onNewIntent不被稱爲

AndroidManifest.xml中

<?xml version="1.0" encoding="UTF-8"?><!-- 

<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.VIBRATE" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.CALL_PHONE" /> 

<permission android:protectionLevel="signature" 
    android:name="com.appName.permission.C2D_MESSAGE" /> 
<uses-permission android:name="com.appName.permission.C2D_MESSAGE" /> 


<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="RB" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme" 
    android:name="com.appName.appExtension"> 
    <meta-data 
     android:name="com.google.android.geo.API_KEY" 
     android:value="API_KEY" 
     /> 

    <activity 
     android:name=".MainActivity" 
     android:label="RB" 
     android:theme="@style/AppTheme.NoActionBar" 
     android:screenOrientation="portrait"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 

    <activity android:name="com.appNamw.RouteView" 
     android:label="@string/title_activity_route_view" 
     android:screenOrientation="landscape"> 

    </activity> 
    <service android:name="com.parse.PushService" /> 
    <receiver android:name="com.appName.ParseReceiver" 
     android:exported="false"> 
     <intent-filter> 
      <action android:name="com.parse.push.intent.RECEIVE" /> 
      <action android:name="com.parse.push.intent.DELETE" /> 
      <action android:name="com.parse.push.intent.OPEN" /> 
     </intent-filter> 
    </receiver> 
    <receiver android:name="com.parse.GcmBroadcastReceiver" 
     android:permission="com.google.android.c2dm.permission.SEND"> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 
      <category android:name="com.appName" /> 
     </intent-filter> 
    </receiver> 
</application> 

ParseReceiver

package com.appName; 

import android.content.Context; 
import android.content.Intent; 
import android.nfc.Tag; 
import android.util.Log; 

import com.parse.ParseAnalytics; 
import com.parse.ParsePushBroadcastReceiver; 

import org.json.JSONException; 
import org.json.JSONObject; 


public class ParseReceiver extends ParsePushBroadcastReceiver { 
    private final String TAG = "Push_Notify"; 

    @Override 
    public void onPushOpen(Context context, Intent intent) { 
    Log.i(TAG, "onPushOpen triggered!"); 

    ParseAnalytics.trackAppOpenedInBackground(intent); 
    Intent mainIntent = new Intent(context, MainActivity.class); 
    mainIntent.putExtras(intent.getExtras()); 
    mainIntent.putExtra("method", "updateStatus"); 

    mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 


    JSONObject pushData; 

    String alert; 
    try { 
     pushData = new JSONObject(intent.getStringExtra(ParseSupplyReceiver.KEY_PUSH_DATA)); 
     alert = pushData.getString("alert"); 
     String name = pushData.getString("name"); 
     String contactNumber = pushData.getString("contactNumber"); 
     String durationText = pushData.getString("duration"); 

     mainIntent.putExtra("alert", alert); 
     mainIntent.putExtra("pushData", new PushData(name, contactNumber, durationText)); 

    } catch (JSONException e) { 
     Log.i(TAG,"JSONException: " + e.getLocalizedMessage()); 
    } 

    context.startActivity(mainIntent); 

    } 
} 
在MainActivity onNewIntent的

PushData.java

package com.appName; 


import android.os.Parcel; 
import android.os.Parcelable; 


public class PushData implements Parcelable{ 
    String name; 
    String contactNumber; 
    String durationText; 


    public PushData (String name,String contactNumber,String durationText){ 
    /* 
    * Reconstruct from the Parcel. Keep same order as in writeToParcel() 
    */ 

     this.name = name; 
     this.contactNumber = contactNumber; 
     this.durationText = durationText; 
    } 

    public PushData(Parcel source) { 
     name = source.readString(); 
     contactNumber = source.readString(); 
     durationText = source.readString(); 

    } 


    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(name); 
     dest.writeString(contactNumber); 
     dest.writeString(durationText); 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 

     public PushData createFromParcel(Parcel source) { 

      return new PushData(source); 
     } 

     public PushData[] newArray(int size) { 

      return new PushData[size]; 
     } 

    }; 
} 

實現:

@Override 
protected void onNewIntent(Intent intent){ 
    super.onNewIntent(intent); 
    setIntent(intent); 

    if (intent.getStringExtra("method").equals("updateStatus")) { 
     alertString = intent.getStringExtra("alert"); 
     pushData = intent.getParcelableExtra("pushData"); 
     updateStatus(); 
    } 
} 



public void updateStatus() { 


    if (pushData != null) { 
     SharedPreferences.Editor editor = preferences.edit(); 
     editor.putString("name", pushData.name); 
     editor.putString("contactNumber", pushData.contactNumber); 
     editor.putString("duration", pushData.durationText); 
    } 
} 

可我知道這裏有什麼問題?我在另一個應用上做了類似的實現,它工作得很好。

+2

如果您將FLAG_ACTIVITY_NEW_TASK更改爲FLAG_ACTIVITY_SINGLE_TOP,該怎麼辦? –

+0

mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_SINGLE_TOP);解決這個問題你能移動這個答案嗎?所以我可以接受 –

+0

很高興聽到它。發表答案。 –

回答

0

我認爲它s not about your FLAG,but your activity s launchmode;

似乎只有當它的launchmode是singleTask或sigleTop時纔會調用此方法;

0

您的Manifest中還存在拼寫錯誤。變化

<activity android:name="com.appNamw.RouteView" 
    android:label="@string/title_activity_route_view" 
    android:screenOrientation="landscape"> 

TO

<activity android:name="com.appName.RouteView" 
    android:label="@string/title_activity_route_view" 
    android:screenOrientation="landscape">