精华内容
下载资源
问答
  • activity启动方式分析

    千次阅读 2012-11-24 17:50:35
    当我们启动一个activity时,这个activity到底是在当前Task中重新new一个,还是如果前面已经创建过,就使用以前的等等,它的产生受很多因素的影响,主要有两类: 1、activity本向的特性,这些特性是我们在...

    当我们启动一个activity时,这个activity到底是在当前Task中重新new一个,还是如果前面已经创建过,就使用以前的等等,它的产生受很多因素的影响,主要有两类:

    1、activity本向的特性,这些特性是我们在AndroidManifest.xml中为其赋予的标签

    android:allowTaskReparenting

    用来标记Activity能否从启动的Task移动到有着affinity的Task(当这个Task进入到前台时)——“true”,表示能移动,“false”,表示它必须呆在启动时呆在的那个Task里。

    如果这个特性没有被设定,设定到<application>元素上的allowTaskReparenting特性的值会应用到Activity上。默认值为“false”。
    一般来说,当Activity启动后,它就与启动它的Task关联,并且在那里耗尽它的整个生命周期。当当前的Task不再显示时,你可以使用这个特性来强制Activity移动到有着affinity的Task中。典型用法是:把一个应用程序的Activity移到另一个应用程序的主Task中。
    例如,如果e-mail中包含一个web页的链接,点击它就会启动一个Activity来显示这个页面。这个Activity是由Browser应用程序定义的,但是,现在它作为e-mail Task的一部分。如果它重新宿主到Browser Task里,当Browser下一次进入到前台时,它就能被看见,并且,当e-mail Task再次进入前台时,就看不到它了。
    Actvity的affinity是由taskAffinity特性定义的。Task的affinity是通过读取根Activity的affinity决定。因此,根据定义,根Activity总是位于相同affinity的Task里。由于启动模式为“singleTask”和“singleInstance”的Activity只能位于Task的底部,因此,重新宿主只能限于“standard”和“singleTop”模式。

    android:alwaysRetainTaskState
    用来标记Activity所在的Task的状态是否总是由系统来保持——“true”,表示总是;“false”,表示在某种情形下允许系统恢复Task到它的初始化状态。默认值是“false”。这个特性只针对Task的根Activity有意义;对其它Activity来说,忽略之。
    一般来说,特定的情形如当用户从主画面重新选择这个Task时,系统会对这个Task进行清理(从stack中删除位于根Activity之上的所有Activivity)。典型的情况,当用户有一段时间没有访问这个Task时也会这么做,例如30分钟。
    然而,当这个特性设为“true”时,用户总是能回到这个Task的最新状态,无论他们是如何启动的。这非常有用,例如,像Browser应用程序,这里有很多的状态(例如多个打开的Tab),用户不想丢失这些状态。

    android:clearTaskOnLaunch
    用来标记是否从Task中清除所有的Activity,除了根Activity外(每当从主画面重新启动时)——“true”,表示总是清除至它的根Activity,“false”表示不。默认值是“false”。这个特性只对启动一个新的Task的Activity(根Activity)有意义;对Task中其它的Activity忽略。
    当这个值为“true”,每次用户重新启动这个Task时,都会进入到它的根Activity中,不管这个Task最后在做些什么,也不管用户是使用BACK还是HOME离开的。当这个值为“false”时,可能会在一些情形下(参考alwaysRetainTaskState特性)清除Task的Activity,但不总是。
    假设,某人从主画面启动了Activity P,并从那里迁移至Activity Q。接下来用户按下HOME,然后返回Activity P。一般,用户可能见到的是Activity Q,因为它是P的Task中最后工作的内容。然而,如果P设定这个特性为“true”,当用户按下HOME并使这个Task再次进入前台时,其上的所有的Activity(在这里是Q)都将被清除。因此,当返回到这个Task时,用户只能看到P。
    如果这个特性和allowTaskReparenting都设定为“true”,那些能重新宿主的Activity会移动到共享affinity的Task中;剩下的Activity都将被抛弃,如上所述。

    android:finishOnTaskLaunch
    用来标记当用户再次启动它的Task(在主画面选择这个Task)时已经存在的Activity实例是否要关闭(结束)——“true”,表示应该关闭,“false”表示不关闭。默认值是“false”。
    如果这个特性和allowTaskReparenting都设定为“true”,这个特性胜出。Activity的affinity忽略。这个Activity不会重新宿主,但是会销毁。

    android:launchMode
    用于指示Activity如何启动。这里有四种模式,与Intent对象中的Activity Flags(FLAG_ACTIVITY_*变量)共同作用,来决定Activity如何启动来处理Intent。它们是:

    "standard"
    "singleTop"
    "singleTask"
    "singleInstance"

    默认模式是“standard”。

    这些模式可以分成两大组别,“standard”和“singleTop”一组,“singleTask”和“singleInstance”一组。具有“standard”和“singleTop”启动模式的Activity可以实例化很多次。这些实例可以属于任何Task并且可以位于Activity stack的任何位置。典型的情况是,它们会进入调用startActivity()的Task(除非Intent对象包含FLAG_ACTIVITY_NEW_TASK标志,在这种情况下会选择一个不同的Task——参考taskAffinity特性)。
    相反的,“singleTask”和“singleInstance”只能启动一个Task。它们总是位于Activity stack的底部。甚至,设备一次只能拥有一个Activity的实例——只有一个这样的Task。
    “standard”和“singleTop”模式只在一种情况下有差别:每次有一个新的启动“standard”Activity的Intent,就会创建一个新的实例来响应这个Intent。每个实例处理一个Intent。相似的,一个“singleTop”的Activity实例也有可能被创建来处理新的Intent。然而,如果目标Task已经有一个存在的实例并且位于stack的顶部,那么,这个实例就会接收到这个新的Intent(调用onNewIntent());不会创建新的实例。在其他情况下——例如,如果存在的“singleTop”的Activity实例在目标Task中,但不是在stack的顶部,或者它在一个stack的顶部,但不是在目标Task中——新的实例都会被创建并压入stack中。
    “singleTask”和“singleInstance”模式也只在一种情况下有差别:“singleTask”Activity允许其它Activity成为它的Task的部分。它位于Activity stack的底部,其它Activity(必须是“standard”和“singleTop”Activity)可以启动加入到相同的Task中。“singleInstance”Activity,换句话说,不允许其它Activity成为它的Task的部分。它是Task中的唯一Activity。如果它启动其它的Activity,这个Activity会被放置到另一个task中——好像Intent中包含了FLAG_ACTIVITY_NEW_TASK标志。

    android:noHistory
    用于标记当用户从Activity上离开并且它在屏幕上不再可见时Activity是否从Activity stack中清除并结束(调用finish()方法)——“true”,表示它应该关闭,“false”,表示不需要。默认值是“false”。
    “true”值意味着Activity不会留下历史痕迹。因为它不会在Activity stack的Task中保留,因此,用户不能返回它。

    android:taskAffinity
    Activity为Task拥有的一个affinity。拥有相同的affinity的Activity理论上属于相同的Task(在用户的角度是相同的“应用程序”)。Task的affinity是由它的根Activity决定的。
    affinity决定两件事情——Activity重新宿主的Task(参考allowTaskReparenting特性)和使用FLAG_ACTIVITY_NEW_TASK标志启动的Activity宿主的Task。
    默认情况,一个应用程序中的所有Activity都拥有相同的affinity。捏可以设定这个特性来重组它们,甚至可以把不同应用程序中定义的Activity放置到相同的Task中。为了明确Activity不宿主特定的Task,设定该特性为空的字符串。

    如果一个Activity没有显式的指明该 Activity的taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果 Application也没有指明,那么该taskAffinity的值就等于包名。而Task也有自己的affinity属性,它的值等于它的根 Activity的taskAffinity的值。

    2、我们在启动activity时调用Intent设置的Flags

    FLAG_ACTIVITY_BROUGHT_TO_FRONT 
    这个标志一般不是由程序代码设置的,如在launchMode中设置singleTask模式时系统帮你设定。

    FLAG_ACTIVITY_CLEAR_TOP
    如果设置,并且这个Activity已经在当前的Task中运行,因此,不再是重新启动一个这个Activity的实例,而是在这个Activity上方的所有Activity都将关闭,然后这个Intent会作为一个新的Intent投递到老的Activity(现在位于顶端)中。
    例如,假设一个Task中包含这些Activity:A,B,C,D。如果D调用了startActivity(),并且包含一个指向Activity B的Intent,那么,C和D都将结束,然后B接收到这个Intent,因此,目前stack的状况是:A,B。
    上例中正在运行的Activity B既可以在onNewIntent()中接收到这个新的Intent,也可以把自己关闭然后重新启动来接收这个Intent。如果它的启动模式声明为“multiple”(默认值),并且你没有在这个Intent中设置FLAG_ACTIVITY_SINGLE_TOP标志,那么它将关闭然后重新创建;对于其它的启动模式,或者在这个Intent中设置FLAG_ACTIVITY_SINGLE_TOP标志,都将把这个Intent投递到当前这个实例的onNewIntent()中。
    这个启动模式还可以与FLAG_ACTIVITY_NEW_TASK结合起来使用:用于启动一个Task中的根Activity,它会把那个Task中任何运行的实例带入前台,然后清除它直到根Activity。这非常有用,例如,当从Notification Manager处启动一个Activity。

    FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
    如果设置,这将在Task的Activity stack中设置一个还原点,当Task恢复时,需要清理Activity。也就是说,下一次Task带着FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记进入前台时(典型的操作是用户在主画面重启它),这个Activity和它之上的都将关闭,以至于用户不能再返回到它们,但是可以回到之前的Activity。
    这在你的程序有分割点的时候很有用。例如,一个e-mail应用程序可能有一个操作是查看一个附件,需要启动图片浏览Activity来显示。这个Activity应该作为e-mail应用程序Task的一部分,因为这是用户在这个Task中触发的操作。然而,当用户离开这个Task,然后从主画面选择e-mail app,我们可能希望回到查看的会话中,但不是查看图片附件,因为这让人困惑。通过在启动图片浏览时设定这个标志,浏览及其它启动的Activity在下次用户返回到mail程序时都将全部清除。

    FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
    如果设置,新的Activity不会在最近启动的Activity的列表中保存。

    FLAG_ACTIVITY_FORWARD_RESULT
    如果设置,并且这个Intent用于从一个存在的Activity启动一个新的Activity,那么,这个作为答复目标的Activity将会传到这个新的Activity中。这种方式下,新的Activity可以调用setResult(int),并且这个结果值将发送给那个作为答复目标的Activity。

    FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY 
    这个标志一般不由应用程序代码设置,如果这个Activity是从历史记录里启动的(常按HOME键),那么,系统会帮你设定。

    FLAG_ACTIVITY_MULTIPLE_TASK 
    不要使用这个标志,除非你自己实现了应用程序启动器。与FLAG_ACTIVITY_NEW_TASK结合起来使用,可以禁用把已存的Task送入前台的行为。当设置时,新的Task总是会启动来处理Intent,而不管这是是否已经有一个Task可以处理相同的事情。
    由于默认的系统不包含图形Task管理功能,因此,你不应该使用这个标志,除非你提供给用户一种方式可以返回到已经启动的Task。
    如果FLAG_ACTIVITY_NEW_TASK标志没有设置,这个标志被忽略。

    FLAG_ACTIVITY_NEW_TASK 
    如果设置,这个Activity会成为历史stack中一个新Task的开始。一个Task(从启动它的Activity到下一个Task中的Activity)定义了用户可以迁移的Activity原子组。Task可以移动到前台和后台;在某个特定Task中的所有Activity总是保持相同的次序。
    这个标志一般用于呈现“启动”类型的行为:它们提供用户一系列可以单独完成的事情,与启动它们的Activity完全无关。
    使用这个标志,如果正在启动的Activity的Task已经在运行的话,那么,新的Activity将不会启动;代替的,当前Task会简单的移入前台。参考FLAG_ACTIVITY_MULTIPLE_TASK标志,可以禁用这一行为。
    这个标志不能用于调用方对已经启动的Activity请求结果。

    FLAG_ACTIVITY_NO_ANIMATION 
    如果在Intent中设置,并传递给Context.startActivity()的话,这个标志将阻止系统进入下一个Activity时应用Acitivity迁移动画。这并不意味着动画将永不运行——如果另一个Activity在启动显示之前,没有指定这个标志,那么,动画将被应用。这个标志可以很好的用于执行一连串的操作,而动画被看作是更高一级的事件的驱动。

    FLAG_ACTIVITY_NO_HISTORY
    如果设置,新的Activity将不再历史stack中保留。用户一离开它,这个Activity就关闭了。这也可以通过设置noHistory特性。

    FLAG_ACTIVITY_NO_USER_ACTION 
    如果设置,作为新启动的Activity进入前台时,这个标志将在Activity暂停之前阻止从最前方的Activity回调的onUserLeaveHint()。
    典型的,一个Activity可以依赖这个回调指明显式的用户动作引起的Activity移出后台。这个回调在Activity的生命周期中标记一个合适的点,并关闭一些Notification。
    如果一个Activity通过非用户驱动的事件,如来电或闹钟,启动的,这个标志也应该传递给Context.startActivity,保证暂停的Activity不认为用户已经知晓其Notification。

    FLAG_ACTIVITY_PREVIOUS_IS_TOP 
    If set and this intent is being used to launch a new activity from an existing one, the current activity will not be counted as the top activity for deciding whether the new intent should be delivered to the top instead of starting a new one. The previous activity will be used as the top, with the assumption being that the current activity will finish itself immediately.

    FLAG_ACTIVITY_REORDER_TO_FRONT
    如果在Intent中设置,并传递给Context.startActivity(),这个标志将引发已经运行的Activity移动到历史stack的顶端。
    例如,假设一个Task由四个Activity组成:A,B,C,D。如果D调用startActivity()来启动Activity B,那么,B会移动到历史stack的顶端,现在的次序变成A,C,D,B。如果FLAG_ACTIVITY_CLEAR_TOP标志也设置的话,那么这个标志将被忽略。

    FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

    If set, and this activity is either being started in a new task or bringing to the top an existing task, then it will be launched as the front door of the task. This will result in the application of any affinities needed to have that task in the proper state (either moving activities to or from it), or simply resetting that task to its initial state if needed.

    FLAG_ACTIVITY_SINGLE_TOP
    如果设置,当这个Activity位于历史stack的顶端运行时,不再启动一个新的。


    转载:

    http://blog.csdn.net/huaciom/article/details/7106466


    展开全文
  • Activity显示启动方式和隐式启动方式

    千次阅读 2017-06-22 11:34:44
    Activity显示启动方式和隐式启动方式
    1、显示启动方式:
       a、Activity直接条状
             Intent intent = new Intent(A.this,B.class);
             intent.putExtra("key","value");//跳转时传递参数
             startActivity(intent);
         
       使用场景:应用内部跳转,频率较高
       
       b、包名、类名
             Intent intent = new Intent();
    intent.setClassName("com.shy","com.shy.B.class");
             intent.putExtra("key","value");//跳转时传递参数
             startActivity(intent);         
        使用场景:内部跳转+外部跳转


         c、ComponentName跳转
             Intent intent = new Intent();
             intent.setComponent(new Component("com.shy","com.shy.B.class"));
             intent.putExtra("key","value");//跳转时传递参数
             startActivity(intent);    
         使用场景:内部跳转+外部跳转


    2、隐式跳转
        AndroidManifest.xml中定义某个Activity的intent-fliter
        <intent-filter>
        <action android:name="com.example.activity.ACTION_START" />
        <category android:name="android.intent.category.DEFAULT" />
      <category android:name="com.example.activity.ACTION_START" />
        </intent-filter>
        Activity中
    Intent intent = new Intent("com.example.activity.ACTION_START");
    //android.intent.category.DEFAULT是一种默认的category,在startActivity时自动添加
    intent.addCategory("com.example.activity.ACTION_START"); 
    startActivity(intent);
    隐式启动,在启动的时候是不明确的,需要匹配系统或AndroidManifest.xml中的intent-filter定义,只有action和category和data完全匹配时,才会启动.
    展开全文
  • Activity在Android APP中的重要性不言而喻,那么了解Activity的几种不同的启动方式对设计出好的App至关重要! 众所周知Activity启动方式有如下几种 1.在“Home”下点击图标,启动应用程序的首个...

    Activity在Android APP中的重要性不言而喻,那么了解Activity的几种不同的启动方式对设计出好的App至关重要!

    众所周知Activity的启动方式有如下几种


    1.在“Home”下点击图标,启动应用程序的首个Activity。我们称之为主Activity,这是最常见的启动方式,而且代表程序具备独立的运行条件。通常会在Manifest中指定某个Activity的android.intent.category属性为Launcher。 (实际上这也是隐式启动Activity的其中一个)


    2.在程序中启动Activity。应用(startActivity() 或者startActivityForResult())启动特定的Activity,或者当程序需要处理一些特定的功能,而其他应用程序中已经具备了这种功能的Activity时,我们可以通过intent-filter来启动Activity


    3.强制程序仅以被其它程序调用的方式启动(没有直接的启动入口):在系统中有相当一部分的应用程序需要有严格的运行条件(Context),其无法以Stand alone的方式独立运行于进程中。具备这种特性的Application大体上分为两种:其一,带有特定返回值的应用程序。parent出于当前操作需要,通过启动其它Application来获得某些特定的资源。例如:输入法或者文件资源选择器等。另外一种情况,经常被调用来修改系统设置或者提供单一有特定目的的操作。这样的Application无需在Home中提供快捷启动方式,其仅仅被其它某些程序在特定的需求下来满足需求。例如:更换系统铃音程序。


    4.在一个Application中包含有多个Mian Activities,并且各自具备有独立的启动入口:很多开发者都习惯于默认的开发配置,一个Application仅仅包含一个独立的应用。然后在特定的需求下可以打破这个限定,系统允许开发者将多个Main Activities应用捆绑在同一个Application中,而且这些Main Activities可以在Home中有独立的启动快捷方式。然而有非常重要的一点需要特别强调,这种方式并不提倡在任何情况下采用,一般当两个应用程序需要调用相同的系统资源或者包含有大部分相同功能的应用时,才可以考虑采用这种方式来简化用户的安装过程(另外一个角度来看,起到优化系统资源的目的)。技术上需要注意为不同的Main Activity定义不同的Task affinity。例如:Camera和Camcorder,它们共同使用摄像头,而且同样采用Gallery作为资源管理器,他们的Task Affinity分别设置为:”com.android.camera” 和 “com.android.videocamera”。


    5.以Widget的方式体现Activity的应用价值:严格意义上来看,这的确算得上是一种启动方式,某些Application将部分常用的功能以Widget的形式在Home或者其它Application中被引用。



    接下来,我们介绍一下有关隐式启动:


    (1) 根据Action和Category信息来进行匹配

    在Manifest.xml中注册该Activity

    <activity android:name=".TestActivity"  android:label="TestActivity">

            <intent-filter >

             <action android:name="cn.xiaoyao.test"/>

             <category android:name="android.intent.category.DEFAULT"/>

            </intent-filter>

    </activity>

    在MainActivity.java里启动该Activity:

    Intent intent = new Intent();

    intent.setAction( "cn.xiaoyao.test");//设置intent的Action属性值

    intent.addCategory(Intent.CATEGORY_DEFAULT);//不加这行也行,因为这个值默认就是Intent.CATEGORY_DEFAULT

    startActivity( intent );


    (2) 根据Action和Data信息进行匹配

    在Manifest.xml中注册该Activity

    <activity android:name=".TestActivity" android:label="@string/testactivity">

    <intent-filter>

                 <action android:name="cn.xiaoyao.test"></action>

                    <category android:name="android.intent.category.DEFAULT"></category>

                    <data android:scheme="xiaoyao"></data>

    </intent-filter>

    </activity>

    如上注册信息,合法的Uri的写法如下:

    //Uri uri = Uri.parse("xiaoyao");//不行

    //Uri uri = Uri.parse("xiaoyao://");//可以

    //Uri uri = Uri.parse("xiaoyao:");//可以

    //Uri uri = Uri.parse("xiaoyao://www.google.com/getDetails?id=123");//可以


    在MainActivity.java里启动该Activity:    

    Intent intent = new Intent();
                intent.setAction("cn.xiaoyao.test");//仅有data不能匹配,所以要设置Action属性
                intent.addCategory(Intent.CATEGORY_DEFAULT);//可去除
                intent.setData(uri);//设置data属性
                startActivity(in);


    (3)  根据action和data的mimeType属性匹配         

    在Manifest.xml中注册该Activity

    <activity android:name=".TestActivity" android:label="@string/testactivity">

    <intent-filter>

    <action android:name="android.intent.action.VIEW"></action>

    <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />

    <category android:name="android.intent.category.DEFAULT"></category>

    </intent-filter>

    </activity>

    在MainActivity.java里启动该Activity:  
                Intent intent = new Intent();
                intent .setAction("android.intent.action.VIEW");
                intent .addCategory(Intent.CATEGORY_DEFAULT);//可去掉
                intent.setType("vnd.android.cursor.dir/vnd.google.note");//要设置Data的MIMEType属性
                startActivity(intent );



    注意:一个Activity中可以包括多个intent-filter属性,intent-filter属性中也可以包含多个data标签对,只需要有一个满足便可以匹配成功

    如果匹配不到合适的Activity启动时,会抛出异常给用户一个提示“应用程序意外停止”!



    部分参考博文: http://www.cnblogs.com/leaven/archive/2011/10/11/2207678.html 

    原文网址:点击打开链接


    展开全文
  • activity启动service的两种方式

    千次阅读 2017-03-22 16:12:33
    activity启动service的两种方式,Parcelable数据传递

    1.startService()
    2.onbind()

    1.测试主页面

    
    package com.example.lab4;
    
    import android.os.Bundle;
    
    import com.example.model.Book;
    import com.example.service.BookService;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Button btn1 = (Button)findViewById(R.id.btn1);
            Button btn2 = (Button)findViewById(R.id.btn2);
            Button btn3 = (Button)findViewById(R.id.btn3);
            btn1.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    //通过start启动 
                    Toast.makeText(MainActivity.this, "fdsfsd", 1000).show();
                    Intent intent = new Intent(MainActivity.this,BookService.class);
                    Book book = new Book ();
                    book.setBookname("陈世滔的书");
                    book.setAuthor("陈世滔");
                    intent.putExtra("book", book);
                    startService(intent);
                }
            });
    
            btn2.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this,BookService.class);
                    stopService(intent);
                }
            });
    
            btn3.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this,GetServiceActivity.class);
                    startActivity(intent);
                }
            });
    
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
    }
    
    

    2.从主页面中启动activity2并将其与service绑定

    package com.example.lab4;
    
    import com.example.model.Book;
    import com.example.service.BookService;
    
    import android.app.Activity;
    import android.content.ComponentName;
    import android.content.Context;
    import android.content.Intent;
    import android.content.ServiceConnection;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.view.Menu;
    import android.widget.TextView;
    
    public class GetServiceActivity extends Activity{
        private BookService bookservice;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.service_activity);
            //与service 绑定
            Intent intent = new Intent(GetServiceActivity.this,BookService.class);
            Book book = new Book ();
            book.setBookname("陈世滔的书");
            book.setAuthor("陈世滔");
            intent.putExtra("book", book);
            bindService(intent, conn, Context.BIND_AUTO_CREATE);
    
            TextView textview = (TextView)findViewById(R.id.text);
            textview.setText("绑定service服务");
        }
    
        private ServiceConnection conn = new ServiceConnection() {
                /** 获取服务对象时的操作 */
                public void onServiceConnected(ComponentName name, IBinder service) {
                    // TODO Auto-generated method stub
                   bookservice = ((BookService.ServiceBinder) service).getService();
    
                }
    
                /** 无法获取到服务对象时的操作 */
                public void onServiceDisconnected(ComponentName name) {
                    // TODO Auto-generated method stub
                    bookservice = null;
                }
            };
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
        @Override
        protected void onDestroy() {
            unbindService(conn);
            super.onDestroy();
        }
    }
    
    
    

    3.服务程序

    package com.example.service;
    
    import com.example.model.Book;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.Binder;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.util.Log;
    
    public class BookService extends Service {
        boolean threadDisable;
        private int count;
        private Book book;
    
        public void onCreate() 
        {
            Log.i("oncreate", "bookservice already created");
            super.onCreate();
            /** 创建一个线程,每秒计数器加一,并在控制台进行Log输出 */
            new Thread(new Runnable() {
                public void run() {
                    while (!threadDisable) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
    
                        }
                        count++;
                        Log.v("CountService", "Count is" + count+"bookname id"+book.getBookname());
                    }
                }
            }).start();
        };
        @Override
        public IBinder onBind(Intent intent) {
            book = intent.getParcelableExtra("book");
            Log.i("onbind", "bookservice already onbind");
            return null;
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.i("onstartCommand", "bookservice already onstartcommand");
            book = intent.getParcelableExtra("book");
            return super.onStartCommand(intent, flags, startId);    
        }
    
        @Override
        public boolean onUnbind(Intent intent) {
            Log.i("onunbind", "bookservice already onunbind");
    
            return super.onUnbind(intent);
        }
    
        @Override
        public void onDestroy() {
            this.threadDisable=true;
            Log.i("ondestory", "bookservice already ondestory");
            super.onDestroy();
        }
    
        //此方法是为了可以在Acitity中获得服务的实例   
        public class ServiceBinder extends Binder {
                public BookService getService() {
                    return BookService.this;
                }
            }
    
        public Book getBook() {
            return book;
        }
        public void setBook(Book book) {
            this.book = book;
        }
    
    }
    

    4.book.java 通过Parcelable的方式传递数据

    package com.example.model;
    
    import android.os.Parcel;
    import android.os.Parcelable;
    
    public class Book implements Parcelable{
        private String bookname;
        private String author;
        public String getBookname() {
            return bookname;
        }
        public void setBookname(String bookname) {
            this.bookname = bookname;
        }
        public String getAuthor() {
            return author;
        }
        public void setAuthor(String author) {
            this.author = author;
        }
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(bookname);
            dest.writeString(author);
        }
        public Book(){}
        public Book(Parcel in)
        {
            this.bookname = in.readString();
            this.author = in.readString();
        }
    
        public static final Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>() {  
            @Override  
            public Book createFromParcel(Parcel source) {  
                return new Book(source);  
            }  
            @Override  
            public Book[] newArray(int size) {  
                return new Book[size];  
            }  
        };
    
    }
    

    5.总结
    5.1通过startService启动Service 时顺序为
    onCreate()->onStartCommand()

    5.2通过onbind启动service时启动顺序为
    oncreate()->onBind()

    5.3 stop关闭service时,关闭顺序为
    直接执行ondestory()

    5.4 unbind关闭时,关闭比顺序为
    onbind()->ondestory()

    展开全文
  • Activity启动另一个Activity的方式总结

    千次阅读 2016-07-27 13:11:54
    下面两种方式均采用这个menifests.xml布局,且下面两种方式属于显性方式{即通过使用(MainActivity.this, xxxx.class)}; 一,用intent构造器进行启动: 二,用Component属性: 下面的方法是隐性方法即...
  • Activity启动流程源码分析
  • Activity启动方式和flag详解

    万次阅读 2013-07-10 20:06:58
    Activity的4种状态: 活动的:当一个Activity在栈顶,它是可视的、有焦点、可接受用户输入的。Android试图尽最大可能保持它活动状态,杀死其它Activity来确保当前活动Activity有足够的资源可使用。当另外一个...
  • Android 启动Activity方式

    千次阅读 2014-08-22 16:57:53
    Activity启动分为两种方式,显示方式和隐式方式,显示方式就是在通过intent启动Activity时指定了Activity的包名和类名, 而隐式方式则在初始化Intent时只指定action或action和data属性。接下来将来总结显示启动和...
  • activity与task的启动模式 ... 当一个Activity启动时,就会把它压入该Task的堆栈,而当用户在该Activity中按返回键,或者代码中finish掉时,就会将它从该 Task的堆栈中弹出。如果我们没有特别的需求,我们的应用
  • 深入Activity,Activity启动模式LaunchMode完全解析 在平时的开发中,我们可能会了解到Activity的任务栈还有Activity的启动模式。那么Activity的启动模式都分别是怎么样的呢?如果设置了这些启动模式对任务栈有事么...
  • Activity的四种启动方式

    千次阅读 2018-02-28 17:17:05
    Activity的四种启动模式 Android开发者在AndroidManifest文件中一共设计了四种启动模式 standard singleTop singleTask singleInstance 一、Android 任务栈 在了解Acvitity的四种启动模式之前,我们必须...
  • 深入理解Activity启动流程(一)--Activity启动的概要流程深入理解Activity启动流程(二)--Activity启动相关类的类图深入理解Activity启动流程(三)--Activity启动的详细流程2深入理解Activity启动流程(四)--Activity ...
  • 显示和隐式启动Activity方式

    千次阅读 2017-03-17 09:27:18
    启动Activity主要是通过Intent(意图)来实现。主要分为显示的和隐式的两种。 1、隐式启动Activity  优点:只要知道被启动Activity的Action和Category即可,不用知道对应的类名或者是包名。  只要Activity有对应的...
  • Activity 启动Service两种方式与区别

    千次阅读 2018-10-31 23:22:42
    Activity 启动Service两种方式: startService bindService   startService(Intent): 1.定义一个类继承Service 2.在Manifest.xml文件中配置该Service 3.使用Context的startService(Intent)方法启动该Service ...
  • Activity是Android四大组建之一,负责用户交互界面展示,其重要性不可言喻。...本文基于AndroidP将以首次点击桌面应用图标的方式为线,分析Activity启动,包括分析应用进程启动。文中将涉及不少应...
  • Activity设置启动模式的两种方式

    千次阅读 2018-08-21 23:20:29
    Activity的启动模式用于设置任务栈管理其方式,通常有两种方式设置Activity启动模式。 一种是在AndroidManifest.xml文件中的<activity>节点中设置android:launchMode属性 可以设置四种standard,singleTop,...
  • Activity启动过程详解

    千次阅读 2015-11-05 12:52:49
    如何启动一个Activity?当我们调用startActivity()或startActivityForResult()后是如何启动Activity的?Activity启动模式分析
  • Activity启动模式

    万次阅读 2015-04-22 16:19:23
    launchMode启动方式,Intent flags方式,taskAffinity设置及管理后台任务栈信息
  • Activity启动流程比较复杂, 涉及的类及代码都很多, 本文侧重从整体流程描述这个过程,给出关键节点,尽量少的涉及代码细节。 啥也不说了,先上图。 在看本文的内容时, 可以参照此图片进行阅读。 ...
  • Activity启动过程涉及到的比较多的知识点有Binder的跨进程通讯,建议先看完Binder的跨进程通讯再来阅读本篇文章,在文章阅读开始,我们先要理解Activity启动模型,再者去理解有关Activity启动的基本概念,梳理...
  • Activity四种启动方式简述

    万次阅读 2018-01-11 21:02:58
    Activity启动模式分为四种。(standard、singleTop、singTask、singleInstance);启动模式可在AndroidManifest.xml中,通过&lt;activity&gt;标签的android:launchMode属性设置。 一、standard模式  特点...
  • 老罗Activity启动流程总结

    千次阅读 2018-05-09 21:28:14
    Activity的启动流程我们可以将Activity划分为两种类型,根Activity和子Activity。... 子Activity:由根Activity或其他字Activity启动,他们有可能与启动他们的Activity运行在同一个进程中,也可能运行在不同的进程中。
  • android中的activity启动方式有哪几种 android中的activity启动方式有哪几种
  • activity启动流程

    千次阅读 2012-11-24 16:44:58
    再有一个是以类图的方式展现的activity启动的流程,可以看到各个类的主要作用 主要函数 分析: startActivityLocked 1、 getRecordForAppLocked获取调用者的相关信息保存到ProcessRecord变量,这里传递的...
  • 前言 ... 启动模式的类别Android启动提供了四种启动方式: 标准模式(standard) 栈顶复用模式(singleTop) 栈内复用模式(singleTask) 单例模式(singleInstance) 3. 知识储备 Activity的管理是采
  • Android Activity启动流程分析

    千次阅读 2018-04-17 11:29:20
    概述 Activity作为Android的四大组件之一,Android主要的界面组成部分,用于直接跟用户进行交互操作,在面试中与...启动Activity方式大致有两种:一种是在桌面点击应用程序的图标,进入应用程序的主界面;另一...
  • Activity启动模式详解

    千次阅读 2016-08-09 19:15:52
    Activity启动模式详解对应的试验在这 http://blog.csdn.net/Ash_Zheng/article/details/52165402Activity的启动模式实际上是定义了Activity实例与当前Task的关联方式。所以想要清楚的了解Activity的启动模式,首先得...
  • Activity启动过程笔记

    千次阅读 2016-05-13 13:18:45
    为准备面试,将最近所复习的内容以博客的形式保存起来,方便以后的查询 本文参考老罗的文章... 调用Activity的startActivity实际是内部是调用了startActivityForResult.而在startAc

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 272,942
精华内容 109,176
关键字:

activity启动方式