Hybrid App Question

I have made a browser based web app that sends out the user's lat and lng every 10 seconds. When the page or the browser loses focus, it stops running and the location no longer gets sent out. Is there any way to keep my app running when the browser loses focus? If not, is it possible to create a hybrid app that launches the browser and the page we want, and since it is part native, could it run in the background if the web page/browser loses focus? Thanks.
LVL 9
BobHavertyComhAsked:
Who is Participating?
 
Rafael LepkoskiSoftware DeveloperCommented:
A hybrid app is one that runs native code side by side with a webview.
If you need to use low level features you need to run native code. One approach you can use to achieve this is to build the major part of your code in JavaScript/HTML and for specific features with native code. If you're gonna to this way, I can recommend you two alternatives: PhoneGap and Titanium.

Using PhoneGap you should create a plugin to use native code and call that plugin in JavaScript. Each platform (Android, iOS etc.) must have it's specific plugin.

I never worked with Titanium, but it promisses that you can write your entire app with just JavaScript and then it translates everything to native code when you build the app. I think it's worth a shot. Altough I suspect that maybe it would be easier for you to use PhoneGap, since you are wanting to deal with a feature that are singular to each platform (like Android's WakeLock).
0
 
Rafael LepkoskiSoftware DeveloperCommented:
How exactly are you getting the user location? Could you provide some code?
0
 
BobHavertyComhAuthor Commented:
Hi Rafael, thanks for your response. Here's how I'm doing it.

This gets the position if it has changed.
function watchCurrentPosition() {
    var positionTimer = navigator.geolocation.watchPosition(function (position) {
            setMarkerPosition(currentPositionMarker, position);
            lat = position.coords.latitude;
            lng = position.coords.longitude;
            if (markers.length > 1) {
                for (i = 0; i < markers.length; i++) {
                    bounds.extend(markers[i].getPosition());
                }
                map.fitBounds(bounds);
            }
            else {
                map.panTo(new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude));
            }
        },
        function geo_error(error) {
            switch(error.code) {
                /*case error.TIMEOUT:
                    alert('Geolocation Timeout');
                    break;
                case error.POSITION_UNAVAILABLE:
                    alert('Geolocation Position unavailable');
                    break;
                case error.PERMISSION_DENIED:
                    alert('Geolocation Permission denied');
                    break;
                default:
                    alert('Geolocation returned an unknown error code: ' + error.code);*/
            }
        },
        {
            enableHighAccuracy: true,
            maximumAge: 10000,
            timeout: 10000
        });
}

Open in new window


lat and lng are global variables whose values keep getting set by the code above. Then, every 10 seconds, it sends out whatever value lat and lng contain at that moment to an aspx page, which takes that and writes to a database.

$(document).ready(function(){
    initLocationProcedure();
    //getHomeLocation();
    setInterval(function () { $.get(encodeURI("latlng.aspx?lat=" + lat + "&lng=" + lng)); }, 10000);
});

Open in new window


This all works, but if someone brings up certain other apps to the foreground, it is possible that this will stop sending out it's location because it stops executing if the phone decides to wipe that process out. I've seen this happen and I'm not sure why, or I would like to understand why better. I suppose this really comes down to how the phone treats the browser app itself, and perhaps I would have to have a native app that has a webview in it that displays the web page. This way, if it is native, I could control the pause, resume etc....events.

However, I am also trying the trick where if you have this meta data tag on your page,

<meta name="mobile-web-app-capable" content="yes">

and when you select "save to homescreen", the Droid not only gives it full screen when you click on the shortcut you created, it also appears to treat it as an app in terms of persistence, where I have seen it still running in the background, whereas if someone just launched the browser and typed in the url, it would not persist the same way when it falls out of focus.
0
Ultimate Tool Kit for Technology Solution Provider

Broken down into practical pointers and step-by-step instructions, the IT Service Excellence Tool Kit delivers expert advice for technology solution providers. Get your free copy now.

 
Rafael LepkoskiSoftware DeveloperCommented:
For what I understood, it's not a hybrid app like the title is saying, right? Be more careful specifying your quesetion's title next time.
It seems a good feature to prevent JavaScript execution while your page is in background. Keep in mind that mobile devices have limited resources (battery, RAM and CPU) and it would be terrible if the browser let any arbitrary page to keep consuming the device's resources without any concern.
If you build a hybrid or native Android app, and you really need to keep running some task while in background, you can use PowerManager.WakeLock.
But remember that "with great power comes great responsibility" so use this wisely.

If you need some example of how to use WakeLock, please ask :)
0
 
BobHavertyComhAuthor Commented:
I really appreciate your opinion and advice. So what it comes down to is that if I want to keep most of my web code, but I want access to things like Wakelock or other things to make the execution persist, I need to create a native app with a webview control on it that acts like a browser. Then, since it's technically a native app, even though the only thing it does is display a web page, I can take advantage of the phone's features such as wakelock, and onpause, onresume events etc....

I thought that this was essentially what a hybrid app is. So if you didn't want to write a whole bunch of native code for each platform, and instead wanted a web app that can work across platforms, is this what you would do? Also, would a webpage being viewed inside of a native app webview be expected to behave the same as if you were viewing inside of the phone's chrome or ff browser or are there known problems with this?
0
 
BobHavertyComhAuthor Commented:
Thank you Rafael, that was extremely informative.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.