UX, Platform Guidelines, Performance / Responsiveness. You have to learn about all the lifecycles, frameworks and libraries anyways, the thing no one will teach you is how to create an app that is actually usable. This includes
Other than that and probably most important, yet not Android specific: Clean Code. Everyone can make an app that does something, but you should be able to keep it maintainable and readable, maybe parts of it even reusable.
The variable-declaration style shown in this article is this:
val x : Int
This is not the officially recommended style. The following is recommended:
val x: Int
Edit: After I posted this comment, the page was updated to match the recommended style.
Take 2-3 weeks vacation. Spend all of that time learning to code Java. Ignore everything you might encounter about server-side code (J2EE) or mobile code (J2ME). Try the tutorials at thenewboston. Ignore anything with game or Javascript in the title. Focus. If you had more time or pick this stuff up very quickly, you could learn OO principles along the way.
Prepare yourself for the possibility that you won't "get" programming. It's okay. Not everybody can program. If someone tells you it's easy and you're not trying hard enough, that's bullshit. If someone tells you it's easy and you're not smart enough, that's bullshit. Some people don't get programming just like some other people don't get physics or electrical wiring or anatomy or staying out of jail. It's just that people's minds don't all work the same way and we don't all have the same aptitudes. Some people think they can program, but it's beneath them. You're clearly not in that last group.
Got that? Now take another 2-3 weeks vacation. All that stuff you learned about Java is just the foundation. Now that you know how to generally program in the language of the Android SDK, you need to learn specific techniques for writing Android apps. Just a single example - garbage collection. When you're working on a machine with lots of memory and processing power, you might not think about garbage collection as much as you should. When you're working with an Android app, if you're not thinking about it, you'll get burned.
Most of what I learned about Android-specific development, I learned because I found myself with a few weeks off and committed to completing an app.
Someone pirated an older version of my app Heynote and launched it on the play store.
I read that I should file a DMCA claim to get the pirated version removed and google responded that they decided not to take action.
What should I do now?
I made one of these experiments:
https://play.google.com/store/apps/details?id=cc.openframeworks.inkSpace
happy to answer any questions about it... there's a bunch of other fun projects on the main page and even a call to submit your own https://www.androidexperiments.com/submit
A few things I did that helped me grow quite a bit recently:
And of course, knowing stuff from Effective Java comes as a must before all of this..
In Java objects can be null, but it's easy to forget the check to see if it's null. In Kotlin this mindset is created for you. You have nullables or non-nullables. The non-nullables can never ever be null. The nullables can be null. You can't simply call a function on a nullable. You have to check it it's null first or use the safe call ("variable?. function" the '?' checks if it's null first before executing the function). So this way you are forced to handle null. For more information you can check the website of Kotlin: https://kotlinlang.org/docs/reference/null-safety.html
Being a remote worker helps - no commute. At the end of the workday, I will do one of the following
Keep working
Make dinner
Switch to my hobby project
Go for a run
with no break. Having no kids or social life is also a boon, so if you're serious about your hobby projects you should try to get rid of those.
I find that I really work the most on weekends, though. I keep a Trello board and it absolutely saves my sanity and productivity. Even if all I do during the week is prioritize the board, it helps me when I do have a chunk of time for code.
Is your project released? I had a hard time finding motivation once I got over the honeymoon phase, but when I finally released it the community feedback was more than enough motivation to fix and expand my app.
If it's not released, just focus on that. Decide what needs to be in v1.0 and make plans for v1.1 and beyond, then focus only on making v1.0 as perfect and bugfree as possible. You only launch once, but you do need to launch and not just slog. Defining the finish line is crucial.
That's my two cents. I only have one app released and only for just over a month, so it would be nice to hear from some more ~~jaded~~ experienced hobbists.
edit: Should also mention that my day job is also as an Android dev, so keeping abreast of the latest and greatest is something I can do during work hours. This also is motivating; my side project is where I get to play with all the toys that I'm not allowed to play with on Corporate Project #19942.
The rules are pretty simple: https://sourceforge.net/p/proguard/code/ci/default/tree/src/proguard/optimize/evaluation/SimpleEnumClassChecker.java
If you have a non-default constructor or have any non-private, non-static fields or methods then it doesn't apply.
Actually they've re-written the iOS and Android apps and are calling it Telegram X. They haven't released the source code yet, but I'm curious to see if they've improved their architecture (hopefully several orders of magnitude (jesus christ those Activities are big))
> Paging library - what were they thinking?
Actually, THEIR idea is that you'll be loading new data in the BoundaryCallback
's onZeroItemsLoaded()
method, fetch it async from the network (and track that you are already fetching this data from network right now).
Once it arrives, you save it directly to Room, which will update your DataSource automatically because of you using a LiveData<PagedList<T>>
created by the LivePagedListBuilder(dataSourceFactory)
.
In which case you "observe a LiveData and submit the PagedList to the adapter" and that's it.
The network ones are tricky but they also solve a problem :D
I had a talk about the Paging Library because I actually found its release exciting, and I think I put way too much info in the slides; but that means it might also be helpful even now, see https://www.slideshare.net/GaborVaradi3/paging-like-a-pro
Take the free Android classes offered by Google through Udacity. I was having a really hard time getting into Android myself until I discovered these courses. Make sure you dig into the Udacity site to find all of the free courses. Since Udacity is a for profit corporation, they do their best to try and steer people to take the paid courses. But if you do a little digging, you'll be able to find all of the free stuff.
A lot of apps will download data when they are first opened up. This is usually JSON.
In their JSON feed they probably added something like this: > { "show_splash_screen": false }
The app was then waiting for that value to be true. When Google changed the value (flipped the switch) in their feed, the code to display the splash screen would run.
> “Signal Technology Foundation is an independent nonprofit charity and tax-exempt under section 501c3 of the Internal Revenue Code.”
From https://signal.org/donate/
So they're allowed to use the word “Donate” on Google Play.
For people like me, that don't like "look, I've read the documentation and write many words" articles:
In Kotlin combination of default arguments and named arguments in class constructor can replace plain old "builder" pattern.
See this tweet from MongoDB saying that it won't be killed, and can read more about it on MongoDB's site.
I know you've no ads or iap but you can still make a "pro" version that is basically the same app but gives the users a way to thank you. I know this as I paid for the Wort homebrew app which is no different from the free app. I paid for it as a thank you for the developer as I use the app a lot.
I should add that the pro version only has 500+ installs while the free 100k+. Some reviews on the free app complain about pop ups asking for reviews etc. Some people are never happy. I'd look into offering something extra for a paid version. Even something as simple as "remove these annoying pop ups" would work.
https://www.udacity.com/course/developing-android-apps-with-kotlin--ud9012
This course was just updated, and the content is incredible.
https://android-developers.googleblog.com/2019/05/new-learn-how-to-build-android-apps.html
Inspired by a mockup I saw a little while ago.
Real scrolling containers often don't know their own content size, which is why you see the built in scroll bars of Recycler View freak out some times.
This is a tricky API to write, because its very greedy for two-way information exchange about the scroll position, but almost no real usages of RecyclerView
in the wild know their own content height in absolute terms.
There is no light emulator, because its an emulator. It still has to open a virtual machiine and load the entire android os. Simulators are very light but only iOS has a simulator.
From experience i noticed that the emulators without google play images are the fastest. Personally i stopped using the emulator because it is too much resource heavy, i use a normal phone with https://github.com/Genymobile/scrcpy
Here's an official list of comparisons
As for an ELI5, kotlin allows for the usage of Java 8 features that would otherwise be incompatible on earlier versions of Android (or would require 3rd-party libraries like Retrolambda). Also, it's less verbose and on average would end up with less code than if you wrote the same thing in Java.
More info: Alibaba B2B app defines a WeexPageActivity
activity that can handle http/https
links. However, this activity is exported=false
. If the user has this app installed, and you start a Uri with an HTTP link inside, your own app will crash with a SecurityException
.
The intent system is nice, but it is only as nice as the people who use it. I can't wait for the day it gets fixed, the way content://
Uris are slowly fixing the wholefile://
Uris debacle?
TL;DR: The only way to work around this is to wrap all startActivity
calls with an HTTP link intent with a try-catch for all exceptions. This is in general a good strategy for all intents. The Alibaba app developers are working on a fix.
Edit: Ran into this post by commonsware. Gives better context on the issue.
I would guess this has to do with using it inside of a ViewHolder. Most likely using the synthetic views in an activity or fragment is fine.
From my understanding they had it set-up incorrectly to begin with (which is why they are changing it). To use the synthetic properties in a ViewHolder correctly you are supposed to have it implement a LayoutContainer interface as well as turn on the experimental flag. The synthetic property is more than just a shorthand for findViewById. It handles caching it for future usage. If it doesn't know when to release this view it could potentially leak some memory (which is what this is most likely fixing).
More information: https://kotlinlang.org/docs/tutorials/android-plugin.html#layoutcontainer-support
If nothing else, their testimonials are fake.
First one: https://www.amazon.com/Wireless-Bluetooth-Headphones-Playtime-Cancelling/dp/B07K9XGR7K
The image is a stock photo.
Second image, same again: https://unsplash.com/photos/BBEbl2WKRlU
No SSL cert on their site, site was registered just over a month ago.
Lol. What the hell is this method? I just looked at the source. The method actually returns whether or not the device has this app called Goat Simulator installed.
Edit: Found the commit with this change
The Nearby Connections API now offers the following capabilities: Fully-offline peer-to-peer communication using Bluetooth, BLE and Wifi hotspots. Thats great news ...
EDIT: Proceed with caution, there seems to be some problems with:
Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'. > com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/rxjava.properties
from rxjava as well as some other square libraries. One possible way to resolve:
First, decide how much time you have to spend on the problem and whether it should be tractable or not.
If it's very urgent, and you can hack around it, hack around it. If it's very urgent and important, hack around it now to unblock and then dig into it deeper later (more in a bit). If it's not urgent, you can treat it as a learning experience and dig in deeper if you want to or not. (Basically make sure you don't fall into a rabbit hole while attempting to solve one specific error and make sure you're achieving what you actually need to).
For digging in deeper (because it's just that important, or maybe you just want to learn): make sure you RTFM, figure out where your understanding of the system and the actual system differ – what did you expect to happen, what's happening and then tweak one thing at a time to make sure things are behaving as you would expect them to till you find the reason. There's a lot I could keep writing about this, and I'm fairly certain much better engineers and authors than me have – an example error would have made this easier.
For Android in particular, we're more lucky than iOS engineers because you have access to the underlying code (for the large part) so you can dig into the android source and even debug the part of the framework that runs within your application.
Of course, sometimes it's just frustration and exhaustion in which case you should follow the advice already posted and just take a fresh look at it the next day.
PS. I haven't completed reading this but https://www.amazon.com/dp/B00PDDKQV2/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1 was recommended to me and has been good so far.
"Using underscore for naming the mutable state holder"
Well, this is exactly why underscore was introduced in Kotlin CodeStyle https://kotlinlang.org/docs/coding-conventions.html#names-for-backing-properties
I recommend reading this article first: http://www.sqlite.org/cvstrac/wiki?p=ScrollingCursor
We are going to provide a built in solution that works with recycler view but that got pushed back due to other priorities. (In terms of API, it is very tricky) We are not providing a cursor wrapper because there is some fundemental problems with it (which we will document). If interested in learning why, i recommend reading its C source code.
For now, your best option is to implement what that article suggests and then watch out for the paging artifact that will arrive soon.
Finally a voice of common sense in this useless flame war.
I would like to throw in two more data points:
1) Robert Martin (aka Uncle Bob) in his Clean Code book suggests to drop all scope prefixes to class fields.
2) Steve McConnell in his Code Complete book suggests to use scope prefixes for class fields.
These two suggestions, coming from two (probably) most respected authors in software engineering community, contradict each other. Does this mean that one of them is wrong? No! It just means that it is a matter of personal taste whether to use scope identifiers or not.
I worked on projects that used both approaches, and, for myself, I decided that scope identifiers are better. I read the code outside of IDE, and I hate to see this syntax (which is also error prone):
this.lastName = lastName;
Personally I use this: https://developer.android.com/distribute/tools/promote/device-art.html
And some paint skills to get this effect (example of one of the screens I made): https://play.google.com/store/apps/details?id=com.janeladigital.rentalspt.app
That is a good question. We've discussed this quickly here at DO and it should be possible should you need to however you may encounter problems doing so on a 1GB droplet.
This tutorial will help you get a desktop environment up and running on your droplet and accessible via VNC.
This one will assist you in enabling swap (you will want to do this as what you are looking to do will be memory intensive)
From there you should be able to install the Android SDK just as you would on a normal Ubuntu desktop system.
I would recommend going with the 2GB or 4GB droplet in order for this to work well.
Google just released a whole Udacity course on Android Dev @ https://www.udacity.com/course/ud853. You don't have to pay, just click "view courseware", and it starts from square one on. I have been checking it out and it seems great so far - I highly recommend it as your starting place
The biggest horror in terms of code formatting and architecture is Slide, especially:
For me, the default Clock app's little icon animations when you change tabs are a neat detail that gives it some personality.
I have two paid apps on the market and I make ~125$/day so ~4000$ per month.
Most of the money comes from Caustic. Both are free demos with unlock key apps. No advertising apart from word of mouth and the usual helpful websites like AndroidPolice who have included both in their round ups when they were released.
I'm fine with sharing my numbers as I hate the taboo of talking about money. But I would like to offer the following caveat. This is not a easy money story. I'm not some brilliant/lucky guy who wrote a small app that does one simple thing well and then sat back.
Caustic has been out for about a year and is growing into something pretty big in terms of software projects, and huge in term of mobile "apps". I also work on my apps EVERY single free hour I have, and with that in mind, I make ~20$/h, which is way less than I used to make when working a "real" software job ... but this is more fun :-)
Go with SQLite. It fits nicely within the android environment, has a lot of support/tutorials, lots of ORMs in several fashions (simple mapping, repository pattern, active record pattern etc.) and also enough tools for editing/managing the database on your desktop.
• http://developer.android.com/training/basics/data-storage/databases.html
• http://www.codeproject.com/Articles/783073/A-Simple-Android-SQLite-Example
Some popular ORMs would be SugarORM, greenDao or OrmLite.
If there is any reason you cannot use a relational data storage or certain requirements justify the use of structured/object oriented storage, you can either use CouchDB or establish your own file system storage with e.g JSON files.
It's only useful for specific situations, but HTTP debugging was a real game changer for me. I use Charles. Before I realised HTTP debugging was a thing, I would have to log the crap out of my HTTP requests to see what was coming back, so I could work out how to parse it. With Charles, you can see exactly what information is being sent to/from the server, which makes it much easier to identify issues.
Similarly useful is Paw. Useful for making & analysing requests & responses (with authentication etc) from your computer rather than having to perform the request in-app.
There are some rules for playing YouTube videos, like the video should never play while not visible on the screen. Maybe your app broke some of those rules.
​
It is definitely allowed to play videos from the web, some very popular app do it, like this one.
It's unfortunate that Robert C. "Uncle Bob" Martin is absolutely correct: refactoring legacy code base is scary without unit tests that verify behavior, but there is no guarantee that the code you're meant to refactor can be brought under a test harness without ripping it apart and piecing it back together.
I should really get to the end of that book Donn Felker was talking about in the Fragmented podcast, called "Working Effectively with Legacy Code" i think.
> this.lastName = lastName;
I dunno, I think it's evident that this.lastName
is a field, and lastName
is not.
Although SonarLint was also whining at me for "using a local variable that shadows a field variable". I guess you should say newLastName
and then this doesn't happen?
> 1) Robert Martin (aka Uncle Bob) in his Clean Code book suggests to drop all scope prefixes to class fields.
Personally I prefer that one, he says code should be human-readable. You don't say My mName is ___
, then why are you writing that in your code?
Effective Java Item 45: Minimize the scope of local variables:
> “Minimize the accessibility of classes and members.” By minimizing the scope of local variables, you increase the readability and maintainability of your code and reduce the likelihood of error
Better dev console hype for wednesday? pls?
EDIT: perhaps...a dedicated dev console app? The logo is clearly different than the regular Google Play logo..
EDIT 2: CALLED IT
Here's an article about how Tinder got more people: https://medium.com/message/how-tinder-co-founder-whitney-wolfe-hacked-metcalfes-law-f607dddbde66
Basically they went school to school, kinda like what how indie bands go town to town, building their fan base
As for Grindr-- I guess it's a very niche market?
You cannot list an app store on Google Play which offers a lower rate of commission (more precisely it cannot bypass Google's method of payment, and thus the 30% commission that goes to Google).
Thus, an alternate app store which offered a lower than 30% non-zero commission for paid/in-app purchases could not be listed on Google Play.
Thus on Google Play, there is no price competition on the 30% number for paid/in-app purchases.
In addition, your app on Google Play cannot point to an APK that offers a different payment method, and it is considered good practice among devs to NOT point to a website that hosts such APKs (that have alternate payment methods). So you cannot point to your own website where a variant of your APK resides which offers an alternate payment method bypassing Google.
In addition you cannot point to your own website, where an alternative APK version is made available which violates Google Play policies in general. So Google censoring extends beyond just the Play store, and also to the developer website that your app points to.
In addition, side-loaded apps will face restrictions - as these are OS enforced restrictions, backed up further by Google policy.
Tomorrow they could start putting apps they have banned on their remove-if-seen list:
> That way, no matter where you download an app from, you know it’s been checked by Google Play Protect
EDIT: In addition, regardless of the differences between Google and Apple, IF Apple winds up reducing the 30% commission, there will powerful pressure on Google to do the same. So the pressure on Google may not even be direct, but could arise just from an Apple precedent.
It's part of compilation.
It's not just an IDE warning, but literally you can't compile if you try to pass null to a parameter that isn't nullable for instance.
Just check it out in the docs.
Delegated properties, nullable types, type inference, (limited) reified types, extension functions, extension lambdas, and optional parameters :-D
To get started just check out the docs for those terms at kotlinlang.org -- here's the article for delegated properties: https://kotlinlang.org/docs/reference/delegated-properties.html
Assuming the app that we're talking about here is your "Web Video Cast" app, I'd say that there's a reasonable argument to be made that it's actually violating YouTube's terms of service by allowing you to cast videos from your phone to another device by parsing the page to extract the URL of the video file.
I think in particular section 5.1 (A), (B), (C), possible (E)(iii) depending how ads work in your app, and probably (M) as well could arguably be violated by your app (though it largely depends on exactly how you've implemented various features).
If I were you, I would make the app intent out to the YouTube app directly whenever you get a YouTube URL. That would be the safest approach.
That's really good work! Looks like a very solid first app project.
If you are concerned with it's design and want to take your skills further, definitely checkout the material guidelines. I suggest you this course in particular, it's great for beginners.
Happy learning!
Erik: Most of the time I would use the method profiler built into Android studio to find performance bottlenecks in my code. Another one would be the debug overlays available on the device (showing overdraw, frame rate, etc).
Yaroslav: Do not try to optimize it before you face the problem.
>“Premature optimization is the root of all evil”- Donald Knuth
I'm starting to think a 100%-SSD system should be standard issue for developers.
At home, my computer is 5 years old and was middle-of-the-road when I got it. At work, I have a much higher-end machine, and it's only 1 year old. A few months back, on my home machine, I ditched the hard drive entirely and moved everything to a 1 TB flash drive. The difference is crazy.
For example, definitely not a formal benchmark, but if I reboot the computer and then launch Chrome, the work machine takes 10 to 20 seconds for the browser to start up and bring back all my tabs. On the home computer, which you'd think would be so far behind it would lose almost any contest, it takes 1 second to do the same.
Builds require a bit more CPU, so they're not so slanted toward the I/O spectrum, but it's such a dramatic difference that I can't help but think it's worth it. And 1 TB now costs under $400, and for a developer-class machine, that's not a big difference.
I think there is some confusion here about the difference between unit tests and integration tests.
Unit tests pass dummy values to a method and capture the output.
Integration tests check if the units interact properly.
I read a really nice article about designing unit tests today at work, I'll see if I can find it.
[Edit] http://www.toptal.com/qa/how-to-write-testable-code-and-why-it-matters
I think people should be more thoughtful as to what class they are adding the extension methods to. In the case of the Picasso example, it would make more sense to create the extension to ImageView
instead of Context
i.e.
fun ImageView.loadImageCenterCrop(url: String) { Picasso.withContext(this.context) .load(url) .centerCrop() .fit() .into(this) }
Usage:
mImageView.loadImageCenterCrop(url)
Also, I don't see what is wrong with creating extensions that are utility methods since they were meant to be just that.
https://kotlinlang.org/docs/reference/extensions.html#motivation
My app is at 10-50k downloads, with 500+ ratings avg 4.67, but it's not always a smooth sail. Here are what I learned:
>In this course, you will learn about the importance of data persistence when building an Android app. We'll introduce you to the fundamentals of SQL, the programming language needed to interact with an SQLite relational database. SQLite is a commonly used method to store large sets of data locally on an Android device.
I did that course, but I really don't know why they designed the course so bad. The prof seems to be a nice guy but he can't teach. Basically he is just reading over a text file. I find that course really boring.
I really liked this course on Coursera. Although OP is not looking for video tutorials, but I really recommend this course. You get to build easy but functional apps really fast. I followed this course and another youtube channel and in 2 months I built an app which connected(via BT) to several sensors, uploaded the sensors data to a dropbox account synced with another device and a web application. and alot of other features on the android app. My major is mechanical engineering and this was my first real app. But that course on coursera really helped me to understand basics of android in less than 10 days.
Project link: http://inloop.github.io/svg2android/
Used software for creating example SVG: https://inkscape.org/en/
VectorDrawable is supported only on lollipop for now (api 21), VectorDrawableCompat will be added to support library for older Android versions soon.
Do you want to write a game or an engine? If you want to write a game, using an established, well tested framework or engine is your best bet. Internet is filled with stories of endless engine development, and they, in most cases, never get finished. So for a 2D game on Android and using Java, I would recommend libgdx.
If you really want to start from scratch, you can either draw on Android views (through Canvas I believe) or go directly to OpenGL. I don't think anyone really writes games using normal Views, it's all about OpenGL due to performance. Googling something like "android canvas game loop" or "android opengl game loop" will get you started. Game loop is essential to game development and one of the starting concepts so you should find some basic tutorials.
I can't recommend anything, because I've always used a framework myself. I can recommend /r/gamedev though, lots of resources there and it's focused on game development while /r/androiddev focuses more on apps I believe.
You are wrong about Firebase daily limits. Go to this page to check out pricing/limits of firebase - https://firebase.google.com/pricing/
If you know even little bit of python, you can create a super light flask app for your tasks quickly and host it on digital ocean/linode for 5 dollars per month.
For your use case firebase seems to be the easiest and quickest way to get started.
Hey man isn't that logo awfully similar to Google Snapseed?
https://play.google.com/store/apps/details?id=com.niksoftware.snapseed&hl=en_IN
https://play.google.com/store/apps/details?id=com.jakewharton.smsmorse.free
I do, but Google is so big that the Play stuff might as well be its own company. Google is like 100 companies that all just happened to be paid by Uncle Larry and Uncle Sergey. It's always so funny watching people talk about Fuschia and Flutter and Android and Chrome(book) as if there's some cross-functional strategy for the future. It's 4 wholly unrelated products worked on by 4 wholly unrelated companies that all happened to be named Google.
Yeah, android studio isn't friendly to newbies. I recommend reading The Big Nerd Ranch to get started on basics(the basics can be hard sometimes).
It should be at your local library.
Also, make sure you understand important concepts in java (like interfaces).
So you have links to another app in there
https://play.google.com/store/apps/details?id=io.utk.android
and I realize that is your own app but I can swear Google doesn't allow you to do that even if it is your own app but maybe I just dreamt that rule, more like a nightmare than a dream really.
Small thing that might be useful: if you use coroutines in your SDK, you can give them names that indicate they were launched by your SDK https://kotlinlang.org/docs/coroutine-context-and-dispatchers.html#naming-coroutines-for-debugging. This would make it obvious to users debugging their app which coroutines were launched by your SDK.
When I was searching for a side project I generally went through websites like http://www.programmableweb.com and searched for cool APIs I can use without much fuss. I recommend you do the same.
Also, don't limit yourself to 1 API. Sometimes a good app can be one that combines a couple different APIs to offer a unique service.
I would really love an application like Way of Life on iOS which is a simple habit tracker with yes/no/skip, and CSV export.
I have tried most of the habit apps on the Play Store and they always have complicated stuff like account creation, annoying notifications, or deadlines (which I don't care about).
I plan to write it one day but I haven't got the time right now.
Good god no, how is this getting so many upvotes?
If you want to create a real Android application with Python, use http://kivy.org/
SL4A is not worth using for anything other than command line based background scripts, you cannot create a GUI application with it because it doesn't have access to the APIs required for such a thing. Kivy does.
You CAN write full...production quality apps in Python just fine. Get started here: http://kivy.org/docs/guide/android.html
To add to this, Kotlin is fairly easy to start learning. I'd wager that most Java developers can pick up the basics in an hour or two. An excellent place to begin is Koans, a tutorial set which starts at 'Hello World' and guides you through the major language features.
Yes absolutely. You can use any server technology you want to serve as the backend for an Android app!
Python is probably best done with Django, a popular web framework for python. You will have to adapt your scripts a bit to run in Django - use models, views, etc, but once you have it up and running you will love how extensible it is.
Check out Django and see if it fits for you: https://www.djangoproject.com/
I've written 3 backends in Django that serve Android and iOS apps and they work excellently. You will probably want to use django-rest-framework to make your APIs. The web is full of excellent tutorials for setting up stuff like this.
I recognize that Django might be a bit too heavy for you - there is some learning curve and it enforces a particular project structure that you'll need to adjust to, and there might be a simpler option. But surely you must have a look at Django if you're interested in writing Python backends! If Django is too much for you I've heard good things about Flask: http://flask.pocoo.org/
> with absolutely no custom UI of any kind
I mean, the example app that they shown off at the announcement is anything but standard. That scrolling, zooming behaviour is fairly custom, and runs very smoothly on any device I tried it on. You can see for yourself here: https://play.google.com/store/apps/details?id=com.twodimensions.timeline
> they usually give these things a couple of years before shutting them down
This is just regurgitating /r/android and /r/mandroiddev circlejerk. If this were to be true, then Flutter would have already been dropped. It was started a long time ago, and is not oriented towards customers, but developers, putting it in an entirely different bucket. Mentioning this next to the messaging app cluster fuck is simply wrong.
It's software engineering. These patterns, and the larger collection from the Gang of Four, exist largely to describe how one would structure and organize code in certain situations, or to achieve certain results. Android doesn't have any brewing on it; it's just general software engineering.
To know more, you can look up the Gang of Four book or the book Head First Design Patterns.
I'll bite. https://play.google.com/store/apps/details?id=com.rapidsos.haven
We are working to fix all of the (numerous) problems with traditional 911. We solve the problem of getting the wealth of data / information on your phone, into a ~1970's infrastructure where the dispatchers can see it. The stuff i am most proud of, is our support for Deaf users ( who cannot use 911 on a cell currently / limited to TTY phones ) and getting accurate locations to the dispatchers . There is other neat stuff involved like our server maintains the call to 911 (so it can never drop, and it will never stop calling you back until the 911 dispatchers hang up the call ) as well as intelligently choosing between VOIP, PSTN (regular cellular call ) or sending you to your native cellular dialer based on changing network conditions in real time. If you like pictures, there is an explanation of the above here: https://rapidsos.com/whyrapidsos/
If you use the app, pay attention to the "Test Mode" feature. If you hit one of the tiles while not in test mode, it will call 911, and you cannot hangup the call without speaking to the dispatchers.
Also i'm the lead developer (Team of 3 on Android currently). Your feedback will be directly addressed.
Also its currently free, every user gets a complimentary subscription.
I'm a developer of Yandex.Mail app.
First of all, we, do continuous integration. We use Teamcity and on every pull request we run in parallel (with separate check reports via Github status API):
We also run remaining Espresso tests and blackbox functional tests (Appium framework) on nightly or on-demand basis. We wish we could run them on CI as well, but they tend to be too slow and sometimes result in false negatives, so they still need some human assistance..
Another cool thing related to testing we do is we report Appium test results in our internal QA test cases tracker. QA engineers store tests scenarios there, distribute tasks among each other and stuff. This way, manual testers don't have to know anything about Appium and its reports format at all. They just know that a certain test case was verified by automated testing and that they don't have to test it manually.
We also have an internal platform for projects localization, basically, we don't enter any string resources manually, but instead add them via this localization system's web interface and then pull the strings via its API in our project. That way, people who actually translate stuff don't have to deal with Android project, they just type the translations in web interface and we can pull them afterwards.
I'm using the Google Drive api, so I think it works the same for the Gmail api. But I don't store any information about the Google account in my app except for the email address. I Let the user select the Google account from their accounts and use that to query for a token. The account manager will know when it needs to refresh the token so I don't refresh the token myself. I Only ask for the token when I need it when the app performs a synchronization.
I Do make my own account in the account manager, but that is only used to setup when the app needs to do a synchronization in the background, the account does not have any login or token information stored.
You can see how it works in my app: https://play.google.com/store/apps/details?id=com.cubeactive.qnotelistfree
You do need to catch login errors though. Because it can happen that the token is expired (this happens in a few rare cases, I think it's when you change your password of something like that) and the token is not yet refreshed. In that case it can take a little while before the device will get a new token. I've found that it did not help to tell the accountmanager that the token needs to be refreshed.
follow the material design guidelines, and understand that just about every element is meant to be at a minimum 8dp apart for the other. this creates a well structured grid.
check out https://play.google.com/store/apps/details?id=com.faizmalkani.keylines&hl=en
Unless someones done your idea exactly like youve done it, its still worth doing. If its done well, people may appreciate the differences, even if they are minor.
Or if someone's done your idea, but its using old design standards, or implemented poorly, then people may be willing to convert.
Yarn for Hacker News isn't the first Hacker News reader, and doesn't offer much that the others don't, but sets itself apart with its material design and general polish
Ultimately, if you just want it to be a portfolio piece then you can just throw it up on the play store and see what happens. If it gets a good rating and/or makes a bit of dosh thats awesome. If not, take it down and its not like you would have lost anything.
If going open source, keep the repo private until you release and then convert it to public. Unless its a massive success, it'll be too late for people to rip it off. And if it is a massive success, people would copy it anyway
Designs like the one OP posted are a common trend on designer communities like Dribbble. Since the iOS 7 launch every app design has exaggerated animations, purple to cyan gradients and blurred backgrounds.
Your biggest issue is the name. In general, for third party apps, the naming guidelines are to use "<appname> for <trademark>" (so "Social Companion for Pokemon Go" in your case) instead of putting the trademarked term first. "PokeGo Social" might potentially work but I'm not sure, it's kind of in a grey area. Your logo is probably a problem too. You can check out the official developer guidelines for some more help on what's okay and what isn't.
As for the content itself, and using the pokemon sprites, it's also a bit of a grey area. Here's a good article explaining what can be considered "fair use". In this case it's hard to say. You aren't profiting from it, but it isn't really an "informative" work either. A quick search for similar apps comes up with a Pokemon Wikia app which uses lots of pokemon images, they have some links in their app description which explain how they are able to use them legally. You might check that out and see how they do it. Hope this helps!
haha, i was a mod in blackdroid's IRC room. I'm probably the one who game you the link. What was your IRC name?
Oh, here's the link
take this Udacity course - https://www.udacity.com/course/viewer#!/c-ud853/l-1395568821/m-1643858568
Bring that app into a Job Interview and be able to explain everything that it does. That's how I was hired. Now I am working on my first professional app.
The Udacity course should help you grasp the fundamentals. After that, build your own app. The twitter client below is a perfect example.
Disclaimer: I work for Realm
Just to clear up some errors in your post.
Limitations in your context is probably:
Include native codes. With APK split it still adds about 800k to your APK
We don't support subclassing our models yet. Composition over inheritance for now.
Given the requirements you listed, it sounds like you should give us a second glance, but up to you :)
Make two applications, one free demo and one paid full. Make the paid app check if the demo is installed, and offer to import the save. Make the demo offer a link to the full version when you reach the end of the demo, since if your demo contains the full game from an IAP it will be easier to pirate. Feel free to protect the full app appropriately (hopefully without inconveniencing legit users). Users are used to seeing demo apps, and will not be surprised when offered the full game at some point - just don't be obnoxious about it. Clearly label the demo as a demo rather than light/lite. "Lite" is more common for apps, and I typically associate it with offering most or all of the content, but including ads or limits (like time or total runs, etc).
To keep the save between apps, something like this should help you set up importing saves. This tutorial might help as well.
No IAP, potentially better security, and no save loss.
I am using Firebase Remote Config for this purpose.
I save a int value indicating the min app version code needed to use the app. When the app is started I check if the value in the remote config is lower or equal to the app version code to continue. Otherwise a prompt to update is shown. I also have another String variable in the Remote Config to indicate the message that must be shown.
Same thing happened to me. Someone took my FOSS app and put ads in and uploaded to google play. They have dozens of apps like it
https://play.google.com/store/apps/details?id=com.avictlab.grow&hl=en_GB&gl=US
Google Podcasts: Die besten Inhalte – kostenlos
(link)
besten
- best in Englishkostenlos
- free in English😃
Classes. Methods. Interfaces. Generics. Collections. Visibility and Scope. Packages. Annotations. Variables and Fields Static/Class functions/fields etc. Threads and Threading Basics (synchronized and locks at least)
I would read a couple books if you can like Effective Java, and a beginners java book as well just to make sure you understand the basic concepts of programming etc.
Hello Guys, I'm the author of FastHub, I would like to let you know that the reason was behind making of FastHub was due to the fact that most the (few) Github client apps are either don't look good or buggy, I know that FastHub design is not perfect or its 100% free bugs, but yet I think it make things easier for browsing & interacting with Github from your phone & I'll be gladly fixing bugs for a long term.
FastHub does contain ads, but I know we DON'T like Ads, so its disabled by default, and its your choice to either enable them or disable them.
FastHub as well was developed from ground up by not relying on Github app or cloning other Github clients and just fix their bugs, it took me awhile to develop it, since last year October, it could have been finished awhile ago, but then I'm an employee and couldn't really find much time to finish it earlier.
Please let me know of your thoughts, what could be improved and what is missing and maybe we could work it together to make it better than its current state!.
Play store link: https://play.google.com/store/apps/details?id=com.fastaccess.github
I'm a novice developer so someone correct me if I'm wrong.
It's a bit of an odd question since android studio is just the IntelliJ IDE with Android components. While Unity is more of an engine/framework that exports the results effortlessly to Android.
If you've never made a game before on Android Studio from scratch, I'd probably recommend starting with a framework/engine like libdx/framework so you wouldn't have to reinvent the wheel.
Both seem to be heavily documented so you'd probably have great support. For a really simple card game though, you might be able to get away with just Android Studio. Really depends how intricate things get.
Might be confusing since I gave opposite advice but for example of the game is like
https://play.google.com/store/apps/details?id=com.expandedlabs.kingscupcast
Then it's definitely doable with just Android Studio. Hopefully that helps.
The nanodegrees on Udacity aren't free, but there's plenty of good, free content on there still. That's how I became a developer, also without a degree.
Try Android courses on Udacity, that was made in collaboration with Google. Advantage of these courses is that you practice writing code most of the time and plus they do very clear explanations.
I advice you to start with this one: https://www.udacity.com/course/android-basics-user-input--ud836
All materials are totaly free, but if you want certificate you should pay.
And check this collection of courses and tutorials made by Google for Android developers: https://developers.google.com/training/android/#for-developers
Google made this course for help developers about design aspect of their app, So far I liked it but I am just developing my First app So I am not the person who knows a lot about design and app development. Anyway here is the link to course;
https://www.udacity.com/course/material-design-for-android-developers--ud862
I'd stay away from anything that claims to teach you how to make money only if you pay them money first.
*I feel like I should tell you this because you seem a bit wallet-trigger-happy, paying for the above (udacity) is optional (read: thoroughly useless) It's all free. Don't click the pay button.
There is this great website: https://www.flaticon.com/
There are a lot of different icons, most of them are usable for free if you put credits in your app (there are some premiums too but not too many).
Most devs here will probably still prefer Dagger 2. I hope that Google will finally add a dagger-kotlin artifact this year and utilize the language features to full extent (typealiases, better annotations etc.). Since you use RxJava, take a look at RxKotlin. It provides extension functions with improved SAM conversion support for RxJava. MockK is a nice replacement for Mockito.
BTW: Take a look at Objectbox if you like Realm. This isn't related to the topic but I think that it's really underrated.
As you say, there are no hard definitions for these design patterns, having said that, from my understanding the major difference between MVC and MVP / MVVM is where the the View get's it's model data from. Whereas in MVC the View would have a reference to a Model from which it accesses it's data, in MVP the model is hidden behind the Presenter, so the data is provided through the Presenter to the View.
MVC diagram: http://www.tutorialsteacher.com/Content/images/mvc/mvc-architecture.png
Because of this, the responsibility of formatting the Model's data (if required) into something that can be displayed is the responsibility of the Presenter, which minimises the amount of business rules defined in the View and Model classes, which in turn make the Presenter a prime candidate for unit testing.
> They mention desktop a lot, right next to mobile/tablet. Do you think Google will come out with tools to make implementing Material Design on your web app easier?
Check out http://www.polymer-project.org/
Because I think Java is a pre-requisite because you need an understand of the annotations that manipulate what gets generated behind the scenes (@JvmStatic
, @JvmField
, and so on).
See https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html
Once you know what you want to achieve with the Kotlin code you are writing, it helps a lot.