Showing posts with label Push Notification. Show all posts
Showing posts with label Push Notification. Show all posts

Saturday, May 3, 2014

Android: adding backstack to the Pushnotification Activity

When User has an action on notifications, the activity is launching on tap of the notification but on press back application closes normally.

We can open activity rather than closing application on back press.

How to achieve this?

By building back stack to the application, when coming from the notification.
So, we need to know about the parentActivityName and Create back stack when starting the activity

Specify parent activities in the manifest

Beginning in Android 4.1 (API level 16), we can declare the logical parent of each activity by specifying the android:parentActivityName attribute in the <activity> element.  

<activity android:name="com.vardhan.pushnotificationtest.HomeActivity" />
<activity android:name="com.vardhan.pushnotificationtest.PushNotificationActvity"
          android:parentActivityName="com.vardhan.pushnotificationtest.HomeActivity"  >
</activity>


If your app supports Android 4.0 and lower, include the Support Library with your app and add a element inside the <activity>. Then specify the parent activity as the value for

<activity android:name="com.vardhan.pushnotificationtest.HomeActivity" />
<activity android:name="com.vardhan.pushnotificationtest.PushNotificationActvity" >
         
          <meta-data
                   android:name="android.support.PARENT_ACTIVITY"
             android:value="com.vardhan.pushnotificationtest.HomeActivity" />
</activity>

Create back stack when starting the activity

Adding activities to the back stack begins upon the event that takes the user into your app. That is, instead of calling startActivity(), use the TaskStackBuilder APIs to define each activity that should be placed into a new back stack. Then begin the target activity by calling startActivities(), or create the appropriate PendingIntent by calling getPendingIntent().

// Intent for the activity to open when user selects the notification
Intent displayIntent = new Intent(this, PushNotificationActvity.class);

// Use TaskStackBuilder to build the back stack and get the PendingIntent
PendingIntent contentIntent = TaskStackBuilder.create(this)
                   // add all of SecondActvity's parents to the stack,
                   // followed by SecondActvity itself
                   .addNextIntentWithParentStack(displayIntent)
                   .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

// Creates notification Builder, set small icon, title, style and content to the builder.
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
                   this).setSmallIcon(R.drawable.ic_stat_gcm)
                   .setContentTitle("GCM Notification")
                   .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
                   .setContentText(msg);

// Puts the PendingIntent into the notification builder
mBuilder.setContentIntent(contentIntent);

// Notifications are issued by sending them to the
// NotificationManager system service.
NotificationManager mNotificationManager =
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

// Builds an anonymous Notification object from the builder, and
// passes it to the NotificationManager
mNotificationManager.notify(id, mBuilder.build());

The resulting PendingIntent specifies not only the activity to start (as defined by displayIntent), but also the back stack that should be inserted into the task (all parents of the PushNotificationActvity defined by displayIntent). So when the PushNotificationActvity starts, pressing Back navigates backward through each of the PushNotificationActvity class's parent activities.

Note: In order for the addNextIntentWithParentStack() method to work, you must declare the logical parent of each activity in your manifest file, using the android:parentActivityName attribute (and corresponding <meta-data> element) as described above.

Why PendingIntent?
Intent English meaning is intended; pending said the impending advent of things. 
The PendingIntent specifies an action to take in the future. 

By giving a PendingIntent to another application, you are granting it the right to perform the operation you have specified as if the other application was yourself (with the same permissions and identity). As such, you should be careful about how you build the PendingIntent

Why to use addNextIntentWithParentStack?
Add a new Intent with the resolved chain of parents for the target activity to the task stack.
This is equivalent to calling addParentStack with the resolved ComponentName of nextIntent (if it can be resolved), followed by addNextIntent with nextIntent.



Thanks for reading :) 
Whether this post is helpful?

Have something to add to this post? If you have any other quick thoughts/hints that you think people will find useful? Share it in the comments.

Wednesday, October 24, 2012

Java : Push notifications for iOS and Android


This post gives a small idea about the push notification of iOS and Android.
Life Cycle of Push notification looks as follows




Push Notification overview of APN and GCM Server as follows

PUSH NOTIFICATION
IPhone / IPad
Android
Login into developer console
Login into Google API console,
1. Creating the SSL certificate
1.1. Generating a Certificate Request
    Launch the Keychain Access application on your Mac.
    Select the menu item Keychain Access > Certificate Assistant > Request a Certificate From a Certificate Authority…
    Enter you name and email address (leave CA Email Address blank).
    Select "Saved to disk" to download the .certSigningRequest file to your desktop.

1.2 Creating and Configuring an AppID
                Navigate to the Apple Developer Member Center website, and enter the iOS Provisioning Portal.
                Select App IDs from the menu on the left.
                Select the "New App ID" button and create a new App ID. Make sure you do not enter the wildcard character ("*") in the "Bundle Identifier" field.
                Select "Configure" beside your newly created App ID.
                Check "Enable for Apple Push Notification service". Then, Click "Configure" beside the "Development Push SSL Certificate". The "Apple Push Notification service SSL Certificate Assistant" wizard should be displayed.
                Select "Continue", then select "Choose File" and locate the .certSigningRequest file you created in the previous step.
                Select "Generate" and download the generated SSL certificate.
                Double click on the downloaded SSL certificate to install it in your Keychain.
                In your keychain, under "My Certificates", find the certificate you just added. It should be called "Apple Development IOS Push Services: xxx".
                Right-click on it, select "Export Apple…", and save it as a .p12 file. Do not enter an export password when you prompted!

2. Creating the Provisioning Profile
    Select the "Provisioning" tab in the iOS Provisioning Portal.
    Create a new profile by selecting "New Profile".
    Fill in the information. Make sure you select your developer certificate, the App ID you just created, and the devices you'll be testing with.
    Download the generated Provisioning Profile by clicking the "Download" button under the "Actions" column.
    Install the profile by double-clicking on the downloaded file. This should open the iPhone Configuration Utility App.
               
3. Configuring the Parse App
                If you want your users to be able to send push notifications, you will need to toggle the "Client push enabled?" option to "on" under the "Push Notification Settings" header. This is useful for applications like chat clients, where users need to send push messages. For this tutorial, select toggle the option to "on".
If you haven't created an API project yet, this page will prompt you to do so:
Click Create project. Your browser URL will change to something like:

Note: #project: (4815162342 in this example). This is your project ID,
To enable the GCM service:
  1. In the main Google APIs Console page, select Services.
  2. Turn the Google Cloud Messaging toggle to ON.
Use bundle identifier in the project
Use the project ID (4815162342) in the project
P12 key is generated for the above bundle identifier, Use the p12 key and respective pwd to send push notification from your server to apple server
Create new Server key, which looks like
AIzaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx and used to send push notification from your server to GCM server


Client Side Code
// Register for push notifications

[application registerForRemoteNotificationTypes:
UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeAlert |
UIRemoteNotificationTypeSound];
// Register for push notifications
Handling Remote Notifications
public class GCMIntentService extends GCMBaseIntentService {
public GCMIntentService() {
                super("PRODUCT_ID");
}
// Here PRODUCT_ID is 4815162342
@Override
protected void onError(Context arg0, String arg1) {
}

@Override
protected void onMessage(Context arg0, Intent arg1) {
}

@Override
protected void onRegistered(Context arg0, String arg1) {
}

@Override
protected void onUnregistered(Context arg0, String arg1) {
}
}

for more details visit Android Guide GCM
didRegisterForRemoteNotificationsWithDeviceToken:
Tells the delegate that the application successfully registered with Apple Push Service (APS).
Device Token is generated
Length of the device token is 64 bit.
Send Device Token to server, so it can use it to send push notification
onRegistered(Context context, String regId):
Called after a registration intent is received, passes the registration ID assigned by GCM to that device/application pair as parameter. Typically, you should send the regid to your server so it can use it to send messages to this device.
Java Server Side Code
Add jar file : JavaPNS_2.2.jar
Add Jar file : gcm-server.jar

Thanks for reading :).
Whether this post is helpful? Please leave a comment.