SilentKnight SilentKnight - 2 months ago 19
Android Question

What's the enhancement of AppCompatActivity over ActionBarActivity?

android.support.v7.app.AppCompatActivity
was added into the latest v7 support library as a new feature yesterday.

It is said that
ActionBarActivity
has been deprecated in favor of the new
AppCompatActivity
and that
AppCompatActivity
is base class for activities that use the support library action bar features. So, what are new features of
AppCompatActivity
over
ActionBarActivity
? What enhancements do
AppCompatActivity
have over
ActionBarActivity
? And what are advantages of
AppCompatActivity
? Could somebody supply a few samples?

Any tips are appreciated. And thanks in advance.

PS: what surprised me most is that
AppCompatActivity
which is extended from
android.support.v4.app.FragmentActivity
is the direct parent class of
ActionBarActivity
! I mean actually now that
ActionBarActivity
can do anything that
AppCompatActivity
can do, why did Android pushed out the latter?

Meanwhile, I saw a blog post that states: "It's not a rename from
ActionBarActivity
to
AppCompatActivity
, the internal logic of
AppCompat
is available via
AppCompatDelegate
", so what's the "internal logic" of
AppCompat
? What can
AppCompatDelegate
do? Could somebody post some codes about this?

Answer

As Chris wrote, new deprecated version of ActionBarActivity (the one extending AppCompatActivity class) is a safe to use backward compatibility class. Its deprecation is just a hint for you asking to use new AppCompatActivity directly instead. AppCompatActivity is a new, more generic implementation which uses AppCompatDelegate class internally.

If you start a new development, then you should rather use new AppCompatActivity class right away. If you have a chance to update your app, then replace deprecated ActionBarActivity by the new activity as well. Otherwise you can stay with deprecated activity and there will be no difference in behavior at all.

Regarding AppCompatDelegate, it allows you to have new tinted widgets in an activity, which is neither AppCompatActivity nor ActionBarActivity.

For instance, you inherit an activity from an external library, which, in turn, does not inherit from AppCompatActivity but you want this activity to have tinted materials widgets (views). To make it happen you need to create an instance of AppCompatDelegate inside your activity, override methods of that activity like addContentView(), setContentView() etc. (see AppCompatDelegate javadoc for the full list of methods), and inside those overridden methods forward the calls to inner AppCompatDelegate instance. AppCompatDelegate will do the rest and your "old-fashion" activity will be "materialized".

Comments